From 6ff7163bb901f3b3846163bb567a09f484413135 Mon Sep 17 00:00:00 2001 From: Liviu Dudau Date: Fri, 3 Oct 2014 10:33:21 +0100 Subject: i2c: designware: Add support for changing the bus rate based on DT info The Designware I2C driver does not currently support changing the bus speed even if the hardware is capable of switching to a slower frequency. Add support for passing the clock frequency info in the device tree. Only standard (100kHz) or fast (400kHz) speeds are supported. Signed-off-by: Andrew Jackson Signed-off-by: Liviu Dudau Signed-off-by: Jon Medhurst --- drivers/i2c/busses/i2c-designware-platdrv.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 65a660f29012..2da574a9f03f 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -87,6 +87,7 @@ static int dw_i2c_probe(struct platform_device *pdev) struct i2c_adapter *adap; struct resource *mem; int irq, r; + u32 bus_rate = DW_IC_CON_SPEED_STD; /* NOTE: driver uses the static register mapping */ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); @@ -137,6 +138,22 @@ static int dw_i2c_probe(struct platform_device *pdev) of_property_read_u32(pdev->dev.of_node, "i2c-scl-falling-time-ns", &dev->scl_falling_time); + + r = of_property_read_u32(pdev->dev.of_node, "clock-frequency", + &bus_rate); + if (r) + bus_rate = 400000; /* default clock rate */ + switch (bus_rate) { + case 400000: + bus_rate = DW_IC_CON_SPEED_FAST; + break; + case 100000: + bus_rate = DW_IC_CON_SPEED_STD; + break; + default: + dev_err(&pdev->dev, "Invalid bus speed (not 100kHz or 400kHz)\n"); + return -EINVAL; + } } dev->functionality = @@ -147,7 +164,7 @@ static int dw_i2c_probe(struct platform_device *pdev) I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_I2C_BLOCK; dev->master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE | - DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST; + DW_IC_CON_RESTART_EN | bus_rate; /* Try first if we can configure the device from ACPI */ r = dw_i2c_acpi_configure(pdev); -- cgit v1.2.3