[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