[linux-yocto] [PATCH 13/29] i2c: designware-pcidrv: Option to set custom HCNT, LCNT and SDA value
rebecca.swee.fun.chang at intel.com
rebecca.swee.fun.chang at intel.com
Mon Apr 7 08:18:04 PDT 2014
From: "Chew, Chiau Ee" <chiau.ee.chew at intel.com>
Provide option to set the HCNT, LCNT and SDA if the target values are known
ahead. Instead of depends on formula to calculate the HCNT and LCNT.
Signed-off-by: Chew, Chiau Ee <chiau.ee.chew at intel.com>
Signed-off-by: Maurice Petallo <mauricex.r.petallo at intel.com>
---
drivers/i2c/busses/i2c-designware-pcidrv.c | 55 ++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c
index 3599a6b..4f4398f 100644
--- a/drivers/i2c/busses/i2c-designware-pcidrv.c
+++ b/drivers/i2c/busses/i2c-designware-pcidrv.c
@@ -70,6 +70,12 @@ struct dw_pci_controller {
u32 tx_fifo_depth;
u32 rx_fifo_depth;
u32 clk_khz;
+ u32 ss_hcnt;
+ u32 ss_lcnt;
+ u32 fs_hcnt;
+ u32 fs_lcnt;
+ u32 ss_sda;
+ u32 fs_sda;
};
#define INTEL_MID_STD_CFG (DW_IC_CON_MASTER | \
@@ -150,6 +156,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_1] = {
.bus_num = 1,
@@ -157,6 +169,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_2] = {
.bus_num = 2,
@@ -164,6 +182,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_3] = {
.bus_num = 3,
@@ -171,6 +195,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_4] = {
.bus_num = 4,
@@ -178,6 +208,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_5] = {
.bus_num = 5,
@@ -185,6 +221,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
[byt_6] = {
.bus_num = 6,
@@ -192,6 +234,12 @@ static struct dw_pci_controller dw_pci_controllers[] = {
.tx_fifo_depth = 32,
.rx_fifo_depth = 32,
.clk_khz = 100000,
+ .ss_hcnt = 0x200,
+ .ss_lcnt = 0x200,
+ .fs_hcnt = 0x55,
+ .fs_lcnt = 0x99,
+ .ss_sda = 0x6,
+ .fs_sda = 0x6,
},
};
static struct i2c_algorithm i2c_dw_algo = {
@@ -315,7 +363,14 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev,
I2C_FUNC_SMBUS_BYTE_DATA |
I2C_FUNC_SMBUS_WORD_DATA |
I2C_FUNC_SMBUS_I2C_BLOCK;
+
+ dev->ss_hcnt = controller->ss_hcnt;
+ dev->ss_lcnt = controller->ss_lcnt;
+ dev->fs_hcnt = controller->fs_hcnt;
+ dev->fs_lcnt = controller->fs_lcnt;
dev->master_cfg = controller->bus_cfg;
+ dev->sda_hold_time = (dev->master_cfg & DW_IC_CON_SPEED_FAST) ?
+ controller->fs_sda : controller->ss_sda;
pci_set_drvdata(pdev, dev);
dev->tx_fifo_depth = controller->tx_fifo_depth;
--
1.7.10.4
More information about the linux-yocto
mailing list