diff options
-rw-r--r-- | drivers/i2c/busses/i2c-designware-core.c | 11 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-designware-core.h | 12 |
2 files changed, 23 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index f325ec7abfb1..dbecf08399f8 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
@@ -317,6 +317,12 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
317 | 47, /* tLOW = 4.7 us */ | 317 | 47, /* tLOW = 4.7 us */ |
318 | 3, /* tf = 0.3 us */ | 318 | 3, /* tf = 0.3 us */ |
319 | 0); /* No offset */ | 319 | 0); /* No offset */ |
320 | |||
321 | /* Allow platforms to specify the ideal HCNT and LCNT values */ | ||
322 | if (dev->ss_hcnt && dev->ss_lcnt) { | ||
323 | hcnt = dev->ss_hcnt; | ||
324 | lcnt = dev->ss_lcnt; | ||
325 | } | ||
320 | dw_writel(dev, hcnt, DW_IC_SS_SCL_HCNT); | 326 | dw_writel(dev, hcnt, DW_IC_SS_SCL_HCNT); |
321 | dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT); | 327 | dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT); |
322 | dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); | 328 | dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); |
@@ -331,6 +337,11 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
331 | 13, /* tLOW = 1.3 us */ | 337 | 13, /* tLOW = 1.3 us */ |
332 | 3, /* tf = 0.3 us */ | 338 | 3, /* tf = 0.3 us */ |
333 | 0); /* No offset */ | 339 | 0); /* No offset */ |
340 | |||
341 | if (dev->fs_hcnt && dev->fs_lcnt) { | ||
342 | hcnt = dev->fs_hcnt; | ||
343 | lcnt = dev->fs_lcnt; | ||
344 | } | ||
334 | dw_writel(dev, hcnt, DW_IC_FS_SCL_HCNT); | 345 | dw_writel(dev, hcnt, DW_IC_FS_SCL_HCNT); |
335 | dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT); | 346 | dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT); |
336 | dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); | 347 | dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); |
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 912aa2262866..e8a756537ed0 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h | |||
@@ -61,6 +61,14 @@ | |||
61 | * @tx_fifo_depth: depth of the hardware tx fifo | 61 | * @tx_fifo_depth: depth of the hardware tx fifo |
62 | * @rx_fifo_depth: depth of the hardware rx fifo | 62 | * @rx_fifo_depth: depth of the hardware rx fifo |
63 | * @rx_outstanding: current master-rx elements in tx fifo | 63 | * @rx_outstanding: current master-rx elements in tx fifo |
64 | * @ss_hcnt: standard speed HCNT value | ||
65 | * @ss_lcnt: standard speed LCNT value | ||
66 | * @fs_hcnt: fast speed HCNT value | ||
67 | * @fs_lcnt: fast speed LCNT value | ||
68 | * | ||
69 | * HCNT and LCNT parameters can be used if the platform knows more accurate | ||
70 | * values than the one computed based only on the input clock frequency. | ||
71 | * Leave them to be %0 if not used. | ||
64 | */ | 72 | */ |
65 | struct dw_i2c_dev { | 73 | struct dw_i2c_dev { |
66 | struct device *dev; | 74 | struct device *dev; |
@@ -91,6 +99,10 @@ struct dw_i2c_dev { | |||
91 | unsigned int rx_fifo_depth; | 99 | unsigned int rx_fifo_depth; |
92 | int rx_outstanding; | 100 | int rx_outstanding; |
93 | u32 sda_hold_time; | 101 | u32 sda_hold_time; |
102 | u16 ss_hcnt; | ||
103 | u16 ss_lcnt; | ||
104 | u16 fs_hcnt; | ||
105 | u16 fs_lcnt; | ||
94 | }; | 106 | }; |
95 | 107 | ||
96 | #define ACCESS_SWAP 0x00000001 | 108 | #define ACCESS_SWAP 0x00000001 |