aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/i2c/busses/i2c-designware-pcidrv.c12
-rw-r--r--drivers/i2c/busses/i2c-designware-platdrv.c9
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);