diff options
| author | Jarkko Nikula <jarkko.nikula@linux.intel.com> | 2015-01-23 04:35:55 -0500 |
|---|---|---|
| committer | Wolfram Sang <wsa@the-dreams.de> | 2015-01-26 10:58:26 -0500 |
| commit | 42ffd3907c1663441cd1bd4d1a575930b63a5964 (patch) | |
| tree | b50bac0f8565ef9bb3da2b593b494599a9451804 | |
| parent | c680eed5ccd4a1c99ee48cd41f4e5fdfad497dc2 (diff) | |
i2c: designware: Do not calculate SCL timing parameters needlessly
Do SCL timing parameter calculation conditionally depending are custom
parameters provided since calculated values will get instantly overwritten
by provided parameters.
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-core.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index fbb48fb138e7..6e25c010e690 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
| @@ -320,40 +320,39 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 320 | sda_falling_time = dev->sda_falling_time ?: 300; /* ns */ | 320 | sda_falling_time = dev->sda_falling_time ?: 300; /* ns */ |
| 321 | scl_falling_time = dev->scl_falling_time ?: 300; /* ns */ | 321 | scl_falling_time = dev->scl_falling_time ?: 300; /* ns */ |
| 322 | 322 | ||
| 323 | /* Standard-mode */ | 323 | /* Set SCL timing parameters for standard-mode */ |
| 324 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | ||
| 325 | 4000, /* tHD;STA = tHIGH = 4.0 us */ | ||
| 326 | sda_falling_time, | ||
| 327 | 0, /* 0: DW default, 1: Ideal */ | ||
| 328 | 0); /* No offset */ | ||
| 329 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | ||
| 330 | 4700, /* tLOW = 4.7 us */ | ||
| 331 | scl_falling_time, | ||
| 332 | 0); /* No offset */ | ||
| 333 | |||
| 334 | /* Allow platforms to specify the ideal HCNT and LCNT values */ | ||
| 335 | if (dev->ss_hcnt && dev->ss_lcnt) { | 324 | if (dev->ss_hcnt && dev->ss_lcnt) { |
| 336 | hcnt = dev->ss_hcnt; | 325 | hcnt = dev->ss_hcnt; |
| 337 | lcnt = dev->ss_lcnt; | 326 | lcnt = dev->ss_lcnt; |
| 327 | } else { | ||
| 328 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | ||
| 329 | 4000, /* tHD;STA = tHIGH = 4.0 us */ | ||
| 330 | sda_falling_time, | ||
| 331 | 0, /* 0: DW default, 1: Ideal */ | ||
| 332 | 0); /* No offset */ | ||
| 333 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | ||
| 334 | 4700, /* tLOW = 4.7 us */ | ||
| 335 | scl_falling_time, | ||
| 336 | 0); /* No offset */ | ||
| 338 | } | 337 | } |
| 339 | dw_writel(dev, hcnt, DW_IC_SS_SCL_HCNT); | 338 | dw_writel(dev, hcnt, DW_IC_SS_SCL_HCNT); |
| 340 | dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT); | 339 | dw_writel(dev, lcnt, DW_IC_SS_SCL_LCNT); |
| 341 | dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); | 340 | dev_dbg(dev->dev, "Standard-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt); |
| 342 | 341 | ||
| 343 | /* Fast-mode */ | 342 | /* Set SCL timing parameters for fast-mode */ |
| 344 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | ||
| 345 | 600, /* tHD;STA = tHIGH = 0.6 us */ | ||
| 346 | sda_falling_time, | ||
| 347 | 0, /* 0: DW default, 1: Ideal */ | ||
| 348 | 0); /* No offset */ | ||
| 349 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | ||
| 350 | 1300, /* tLOW = 1.3 us */ | ||
| 351 | scl_falling_time, | ||
| 352 | 0); /* No offset */ | ||
| 353 | |||
| 354 | if (dev->fs_hcnt && dev->fs_lcnt) { | 343 | if (dev->fs_hcnt && dev->fs_lcnt) { |
| 355 | hcnt = dev->fs_hcnt; | 344 | hcnt = dev->fs_hcnt; |
| 356 | lcnt = dev->fs_lcnt; | 345 | lcnt = dev->fs_lcnt; |
| 346 | } else { | ||
| 347 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | ||
| 348 | 600, /* tHD;STA = tHIGH = 0.6 us */ | ||
| 349 | sda_falling_time, | ||
| 350 | 0, /* 0: DW default, 1: Ideal */ | ||
| 351 | 0); /* No offset */ | ||
| 352 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | ||
| 353 | 1300, /* tLOW = 1.3 us */ | ||
| 354 | scl_falling_time, | ||
| 355 | 0); /* No offset */ | ||
| 357 | } | 356 | } |
| 358 | dw_writel(dev, hcnt, DW_IC_FS_SCL_HCNT); | 357 | dw_writel(dev, hcnt, DW_IC_FS_SCL_HCNT); |
| 359 | dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT); | 358 | dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT); |
