On Thu, Sep 04, 2014 at 08:30:05PM +0800, Carl Peng wrote:
> AMD i2c bus controller is ACPI device, its ACPI ID
> is "AMD0010". This patch is used to add support for
> AMD i2c bus controller in the Designware platfrom
> driver.
>
> Signed-off-by: Carl Peng <[email protected]>
> ---
> drivers/i2c/busses/i2c-designware-core.h | 1 +
> drivers/i2c/busses/i2c-designware-platdrv.c | 35
> +++++++++++++++++++++++------
> 2 files changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-designware-core.h
> b/drivers/i2c/busses/i2c-designware-core.h
> index d66b6cb..7a0a56e 100644
> --- a/drivers/i2c/busses/i2c-designware-core.h
> +++ b/drivers/i2c/busses/i2c-designware-core.h
> @@ -105,6 +105,7 @@ struct dw_i2c_dev {
> u16 ss_lcnt;
> u16 fs_hcnt;
> u16 fs_lcnt;
> + u32 vendor;
Not needed.
> };
>
> #define ACCESS_SWAP 0x00000001
> diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c
> b/drivers/i2c/busses/i2c-designware-platdrv.c
> index bc87733..f0556c4 100644
> --- a/drivers/i2c/busses/i2c-designware-platdrv.c
> +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
> @@ -43,16 +43,26 @@
> #include <linux/acpi.h>
> #include "i2c-designware-core.h"
>
> +#define AMD_CLK_KHZ (133 * 1000)
> +#define AMD_I2C_ACPI_ID "AMD0010"
> +#define VENDOR_ID_AMD 0x1022
> +
> static struct i2c_algorithm i2c_dw_algo = {
> .master_xfer = i2c_dw_xfer,
> .functionality = i2c_dw_func,
> };
> +
Unrelated change.
> static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
> {
> return clk_get_rate(dev->clk)/1000;
> }
>
> #ifdef CONFIG_ACPI
> +static u32 i2c_amd_get_clk_rate_khz(struct dw_i2c_dev *dev)
> +{
> + return AMD_CLK_KHZ;
> +}
No, use clock framework to pass correct clock rate to the driver.
> +
> static void dw_i2c_acpi_params(struct platform_device *pdev, char method[],
> u16 *hcnt, u16 *lcnt, u32 *sda_hold)
> {
> @@ -107,6 +117,7 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = {
> { "INT3433", 0 },
> { "80860F41", 0 },
> { "808622C1", 0 },
> + { AMD_I2C_ACPI_ID, 0 },
Please use "AMD0010" here.
> { }
> };
> MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
> @@ -134,6 +145,9 @@ static int dw_i2c_probe(struct platform_device *pdev)
> if (!dev)
> return -ENOMEM;
>
> + if (!strncmp(AMD_I2C_ACPI_ID, pdev->name, strlen(AMD_I2C_ACPI_ID)))
> + dev->vendor = VENDOR_ID_AMD;
> +
This and rest of the hunks can be then dropped once you pass clocks
using clock framework. See how we do it for Intel LPSS devices in
drivers/acpi/acpi_lpss.c
> mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> dev->base = devm_ioremap_resource(&pdev->dev, mem);
> if (IS_ERR(dev->base))
> @@ -145,12 +159,15 @@ static int dw_i2c_probe(struct platform_device *pdev)
> dev->irq = irq;
> platform_set_drvdata(pdev, dev);
>
> - dev->clk = devm_clk_get(&pdev->dev, NULL);
> - dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
> + if (dev->vendor != VENDOR_ID_AMD) {
> + dev->clk = devm_clk_get(&pdev->dev, NULL);
> + dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
>
> - if (IS_ERR(dev->clk))
> - return PTR_ERR(dev->clk);
> - clk_prepare_enable(dev->clk);
> + if (IS_ERR(dev->clk))
> + return PTR_ERR(dev->clk);
> + clk_prepare_enable(dev->clk);
> + } else
> + dev->get_clk_rate_khz = i2c_amd_get_clk_rate_khz;
>
> if (pdev->dev.of_node) {
> u32 ht = 0;
> @@ -255,7 +272,9 @@ static int dw_i2c_suspend(struct device *dev)
> struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
>
> i2c_dw_disable(i_dev);
> - clk_disable_unprepare(i_dev->clk);
> +
> + if (i_dev->vendor != VENDOR_ID_AMD)
> + clk_disable_unprepare(i_dev->clk);
>
> return 0;
> }
> @@ -265,7 +284,9 @@ static int dw_i2c_resume(struct device *dev)
> struct platform_device *pdev = to_platform_device(dev);
> struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
>
> - clk_prepare_enable(i_dev->clk);
> + if (i_dev->vendor != VENDOR_ID_AMD)
> + clk_prepare_enable(i_dev->clk);
> +
> i2c_dw_init(i_dev);
>
> return 0;
> --
> 1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html