i2c: designware: Allow reduce bus speed by "clock-frequency" property
authorJarkko Nikula <jarkko.nikula@linux.intel.com>
Thu, 10 Nov 2016 11:37:20 +0000 (13:37 +0200)
committerWolfram Sang <wsa@the-dreams.de>
Fri, 18 Nov 2016 01:08:03 +0000 (02:08 +0100)
Allow more flexibility to bus speed selection. Now if there are I2C
slave connections defined in ACPI the speed of slowest device on the bus
will define the bus speed. However if also "clock-frequency" device
property is defined we should use the slowest of these two.

This is targeted to maker boards where developer may want to connect
slower I2C slave devices to the bus than defined in existing ACPI I2C
slave connections.

Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-platdrv.c

index 886fb622ca384292a0ed5e3b4a3102c9c1b92df4..7429dfa39440e2f10c387e42b9524d34504d330b 100644 (file)
@@ -176,9 +176,6 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
        dev->irq = irq;
        platform_set_drvdata(pdev, dev);
 
-       /* fast mode by default because of legacy reasons */
-       dev->clk_freq = 400000;
-
        if (pdata) {
                dev->clk_freq = pdata->i2c_scl_freq;
        } else {
@@ -193,8 +190,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
        }
 
        acpi_speed = i2c_acpi_find_bus_speed(&pdev->dev);
-       if (acpi_speed)
-               dev->clk_freq = acpi_speed;
+       /*
+        * Find bus speed from the "clock-frequency" device property, ACPI
+        * or by using fast mode if neither is set.
+        */
+       if (acpi_speed && dev->clk_freq)
+               dev->clk_freq = min(dev->clk_freq, acpi_speed);
+       else if (acpi_speed || dev->clk_freq)
+               dev->clk_freq = max(dev->clk_freq, acpi_speed);
+       else
+               dev->clk_freq = 400000;
 
        if (has_acpi_companion(&pdev->dev))
                dw_i2c_acpi_configure(pdev);