| .. | .. |
|---|
| 12 | 12 | #include <linux/init.h> |
|---|
| 13 | 13 | #include <linux/interrupt.h> |
|---|
| 14 | 14 | #include <linux/kernel.h> |
|---|
| 15 | +#include <linux/module.h> |
|---|
| 15 | 16 | #include <linux/of.h> |
|---|
| 16 | 17 | #include <linux/of_device.h> |
|---|
| 17 | 18 | #include <linux/platform_device.h> |
|---|
| .. | .. |
|---|
| 88 | 89 | u32 count; |
|---|
| 89 | 90 | int irq; |
|---|
| 90 | 91 | int err; |
|---|
| 91 | | - bool is_suspended; |
|---|
| 92 | 92 | }; |
|---|
| 93 | 93 | |
|---|
| 94 | 94 | static void sprd_i2c_set_count(struct sprd_i2c *i2c_dev, u32 count) |
|---|
| .. | .. |
|---|
| 290 | 290 | struct sprd_i2c *i2c_dev = i2c_adap->algo_data; |
|---|
| 291 | 291 | int im, ret; |
|---|
| 292 | 292 | |
|---|
| 293 | | - if (i2c_dev->is_suspended) |
|---|
| 294 | | - return -EBUSY; |
|---|
| 295 | | - |
|---|
| 296 | | - ret = pm_runtime_get_sync(i2c_dev->dev); |
|---|
| 293 | + ret = pm_runtime_resume_and_get(i2c_dev->dev); |
|---|
| 297 | 294 | if (ret < 0) |
|---|
| 298 | 295 | return ret; |
|---|
| 299 | 296 | |
|---|
| .. | .. |
|---|
| 346 | 343 | writel(div1, i2c_dev->base + ADDR_DVD1); |
|---|
| 347 | 344 | |
|---|
| 348 | 345 | /* Start hold timing = hold time(us) * source clock */ |
|---|
| 349 | | - if (freq == 400000) |
|---|
| 346 | + if (freq == I2C_MAX_FAST_MODE_FREQ) |
|---|
| 350 | 347 | writel((6 * apb_clk) / 10000000, i2c_dev->base + ADDR_STA0_DVD); |
|---|
| 351 | | - else if (freq == 100000) |
|---|
| 348 | + else if (freq == I2C_MAX_STANDARD_MODE_FREQ) |
|---|
| 352 | 349 | writel((4 * apb_clk) / 1000000, i2c_dev->base + ADDR_STA0_DVD); |
|---|
| 353 | 350 | } |
|---|
| 354 | 351 | |
|---|
| .. | .. |
|---|
| 475 | 472 | |
|---|
| 476 | 473 | i2c_dev->clk = devm_clk_get(i2c_dev->dev, "enable"); |
|---|
| 477 | 474 | if (IS_ERR(i2c_dev->clk)) { |
|---|
| 478 | | - dev_warn(i2c_dev->dev, "i2c%d can't get the enable clock\n", |
|---|
| 479 | | - i2c_dev->adap.nr); |
|---|
| 480 | | - i2c_dev->clk = NULL; |
|---|
| 475 | + dev_err(i2c_dev->dev, "i2c%d can't get the enable clock\n", |
|---|
| 476 | + i2c_dev->adap.nr); |
|---|
| 477 | + return PTR_ERR(i2c_dev->clk); |
|---|
| 481 | 478 | } |
|---|
| 482 | 479 | |
|---|
| 483 | 480 | return 0; |
|---|
| .. | .. |
|---|
| 487 | 484 | { |
|---|
| 488 | 485 | struct device *dev = &pdev->dev; |
|---|
| 489 | 486 | struct sprd_i2c *i2c_dev; |
|---|
| 490 | | - struct resource *res; |
|---|
| 491 | 487 | u32 prop; |
|---|
| 492 | 488 | int ret; |
|---|
| 493 | 489 | |
|---|
| .. | .. |
|---|
| 497 | 493 | if (!i2c_dev) |
|---|
| 498 | 494 | return -ENOMEM; |
|---|
| 499 | 495 | |
|---|
| 500 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 501 | | - i2c_dev->base = devm_ioremap_resource(dev, res); |
|---|
| 496 | + i2c_dev->base = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 502 | 497 | if (IS_ERR(i2c_dev->base)) |
|---|
| 503 | 498 | return PTR_ERR(i2c_dev->base); |
|---|
| 504 | 499 | |
|---|
| 505 | 500 | i2c_dev->irq = platform_get_irq(pdev, 0); |
|---|
| 506 | | - if (i2c_dev->irq < 0) { |
|---|
| 507 | | - dev_err(&pdev->dev, "failed to get irq resource\n"); |
|---|
| 501 | + if (i2c_dev->irq < 0) |
|---|
| 508 | 502 | return i2c_dev->irq; |
|---|
| 509 | | - } |
|---|
| 510 | 503 | |
|---|
| 511 | 504 | i2c_set_adapdata(&i2c_dev->adap, i2c_dev); |
|---|
| 512 | 505 | init_completion(&i2c_dev->complete); |
|---|
| 513 | 506 | snprintf(i2c_dev->adap.name, sizeof(i2c_dev->adap.name), |
|---|
| 514 | 507 | "%s", "sprd-i2c"); |
|---|
| 515 | 508 | |
|---|
| 516 | | - i2c_dev->bus_freq = 100000; |
|---|
| 509 | + i2c_dev->bus_freq = I2C_MAX_STANDARD_MODE_FREQ; |
|---|
| 517 | 510 | i2c_dev->adap.owner = THIS_MODULE; |
|---|
| 518 | 511 | i2c_dev->dev = dev; |
|---|
| 519 | 512 | i2c_dev->adap.retries = 3; |
|---|
| .. | .. |
|---|
| 527 | 520 | i2c_dev->bus_freq = prop; |
|---|
| 528 | 521 | |
|---|
| 529 | 522 | /* We only support 100k and 400k now, otherwise will return error. */ |
|---|
| 530 | | - if (i2c_dev->bus_freq != 100000 && i2c_dev->bus_freq != 400000) |
|---|
| 523 | + if (i2c_dev->bus_freq != I2C_MAX_STANDARD_MODE_FREQ && |
|---|
| 524 | + i2c_dev->bus_freq != I2C_MAX_FAST_MODE_FREQ) |
|---|
| 531 | 525 | return -EINVAL; |
|---|
| 532 | 526 | |
|---|
| 533 | | - sprd_i2c_clk_init(i2c_dev); |
|---|
| 527 | + ret = sprd_i2c_clk_init(i2c_dev); |
|---|
| 528 | + if (ret) |
|---|
| 529 | + return ret; |
|---|
| 530 | + |
|---|
| 534 | 531 | platform_set_drvdata(pdev, i2c_dev); |
|---|
| 535 | 532 | |
|---|
| 536 | 533 | ret = clk_prepare_enable(i2c_dev->clk); |
|---|
| .. | .. |
|---|
| 581 | 578 | |
|---|
| 582 | 579 | ret = pm_runtime_get_sync(i2c_dev->dev); |
|---|
| 583 | 580 | if (ret < 0) |
|---|
| 584 | | - return ret; |
|---|
| 581 | + dev_err(&pdev->dev, "Failed to resume device (%pe)\n", ERR_PTR(ret)); |
|---|
| 585 | 582 | |
|---|
| 586 | 583 | i2c_del_adapter(&i2c_dev->adap); |
|---|
| 587 | | - clk_disable_unprepare(i2c_dev->clk); |
|---|
| 584 | + |
|---|
| 585 | + if (ret >= 0) |
|---|
| 586 | + clk_disable_unprepare(i2c_dev->clk); |
|---|
| 588 | 587 | |
|---|
| 589 | 588 | pm_runtime_put_noidle(i2c_dev->dev); |
|---|
| 590 | 589 | pm_runtime_disable(i2c_dev->dev); |
|---|
| .. | .. |
|---|
| 592 | 591 | return 0; |
|---|
| 593 | 592 | } |
|---|
| 594 | 593 | |
|---|
| 595 | | -static int __maybe_unused sprd_i2c_suspend_noirq(struct device *pdev) |
|---|
| 594 | +static int __maybe_unused sprd_i2c_suspend_noirq(struct device *dev) |
|---|
| 596 | 595 | { |
|---|
| 597 | | - struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev); |
|---|
| 596 | + struct sprd_i2c *i2c_dev = dev_get_drvdata(dev); |
|---|
| 598 | 597 | |
|---|
| 599 | | - i2c_lock_bus(&i2c_dev->adap, I2C_LOCK_ROOT_ADAPTER); |
|---|
| 600 | | - i2c_dev->is_suspended = true; |
|---|
| 601 | | - i2c_unlock_bus(&i2c_dev->adap, I2C_LOCK_ROOT_ADAPTER); |
|---|
| 602 | | - |
|---|
| 603 | | - return pm_runtime_force_suspend(pdev); |
|---|
| 598 | + i2c_mark_adapter_suspended(&i2c_dev->adap); |
|---|
| 599 | + return pm_runtime_force_suspend(dev); |
|---|
| 604 | 600 | } |
|---|
| 605 | 601 | |
|---|
| 606 | | -static int __maybe_unused sprd_i2c_resume_noirq(struct device *pdev) |
|---|
| 602 | +static int __maybe_unused sprd_i2c_resume_noirq(struct device *dev) |
|---|
| 607 | 603 | { |
|---|
| 608 | | - struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev); |
|---|
| 604 | + struct sprd_i2c *i2c_dev = dev_get_drvdata(dev); |
|---|
| 609 | 605 | |
|---|
| 610 | | - i2c_lock_bus(&i2c_dev->adap, I2C_LOCK_ROOT_ADAPTER); |
|---|
| 611 | | - i2c_dev->is_suspended = false; |
|---|
| 612 | | - i2c_unlock_bus(&i2c_dev->adap, I2C_LOCK_ROOT_ADAPTER); |
|---|
| 613 | | - |
|---|
| 614 | | - return pm_runtime_force_resume(pdev); |
|---|
| 606 | + i2c_mark_adapter_resumed(&i2c_dev->adap); |
|---|
| 607 | + return pm_runtime_force_resume(dev); |
|---|
| 615 | 608 | } |
|---|
| 616 | 609 | |
|---|
| 617 | | -static int __maybe_unused sprd_i2c_runtime_suspend(struct device *pdev) |
|---|
| 610 | +static int __maybe_unused sprd_i2c_runtime_suspend(struct device *dev) |
|---|
| 618 | 611 | { |
|---|
| 619 | | - struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev); |
|---|
| 612 | + struct sprd_i2c *i2c_dev = dev_get_drvdata(dev); |
|---|
| 620 | 613 | |
|---|
| 621 | 614 | clk_disable_unprepare(i2c_dev->clk); |
|---|
| 622 | 615 | |
|---|
| 623 | 616 | return 0; |
|---|
| 624 | 617 | } |
|---|
| 625 | 618 | |
|---|
| 626 | | -static int __maybe_unused sprd_i2c_runtime_resume(struct device *pdev) |
|---|
| 619 | +static int __maybe_unused sprd_i2c_runtime_resume(struct device *dev) |
|---|
| 627 | 620 | { |
|---|
| 628 | | - struct sprd_i2c *i2c_dev = dev_get_drvdata(pdev); |
|---|
| 621 | + struct sprd_i2c *i2c_dev = dev_get_drvdata(dev); |
|---|
| 629 | 622 | int ret; |
|---|
| 630 | 623 | |
|---|
| 631 | 624 | ret = clk_prepare_enable(i2c_dev->clk); |
|---|
| .. | .. |
|---|
| 660 | 653 | }, |
|---|
| 661 | 654 | }; |
|---|
| 662 | 655 | |
|---|
| 663 | | -static int sprd_i2c_init(void) |
|---|
| 664 | | -{ |
|---|
| 665 | | - return platform_driver_register(&sprd_i2c_driver); |
|---|
| 666 | | -} |
|---|
| 667 | | -arch_initcall_sync(sprd_i2c_init); |
|---|
| 656 | +module_platform_driver(sprd_i2c_driver); |
|---|
| 657 | + |
|---|
| 658 | +MODULE_DESCRIPTION("Spreadtrum I2C master controller driver"); |
|---|
| 659 | +MODULE_LICENSE("GPL v2"); |
|---|