diff options
-rw-r--r-- | drivers/i2c/busses/i2c-designware-pcidrv.c | 12 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-designware-platdrv.c | 9 |
2 files changed, 20 insertions, 1 deletions
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index 9dec4bee992..01b55e8ad31 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c @@ -43,6 +43,10 @@ #define DRIVER_NAME "i2c-designware-pci" +static bool force_std_mode; +module_param(force_std_mode, bool, 0); +MODULE_PARM_DESC(force_std_mode, "Force standard mode (100 kHz)"); + enum dw_pci_ctl_id_t { moorestown_0, moorestown_1, @@ -249,6 +253,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, struct dw_i2c_dev *dev; struct i2c_adapter *adap; int r; + u32 mode; struct dw_pci_controller *controller; struct dw_scl_sda_cfg *cfg; @@ -287,6 +292,13 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, dev->functionality = controller->functionality | DW_DEFAULT_FUNCTIONALITY; + mode = controller->bus_cfg & (DW_IC_CON_SPEED_STD | + DW_IC_CON_SPEED_FAST); + if (force_std_mode && !(mode & DW_IC_CON_SPEED_STD)) { + controller->bus_cfg &= ~mode; + controller->bus_cfg |= DW_IC_CON_SPEED_STD; + } + dev->master_cfg = controller->bus_cfg; if (controller->scl_sda_cfg) { cfg = controller->scl_sda_cfg; diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 4c1b60539a2..36bddb82c32 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@ -43,6 +43,10 @@ #include <linux/acpi.h> #include "i2c-designware-core.h" +static bool force_std_mode; +module_param(force_std_mode, bool, 0); +MODULE_PARM_DESC(force_std_mode, "Force standard mode (100 kHz)"); + static struct i2c_algorithm i2c_dw_algo = { .master_xfer = i2c_dw_xfer, .functionality = i2c_dw_func, @@ -167,7 +171,10 @@ 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; + + dev->master_cfg |= (force_std_mode ? DW_IC_CON_SPEED_STD : + DW_IC_CON_SPEED_FAST); /* Try first if we can configure the device from ACPI */ r = dw_i2c_acpi_configure(pdev); |