mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00:00
387f0de6c3
On Rockchip I2C the controller drops SDA low slightly too soon to meet the "repeated start" requirements. >From my own experimentation over a number of rates: - controller appears to drop SDA at .875x (7/8) programmed clk high. - controller appears to keep SCL high for 2x programmed clk high. The first rule isn't enough to meet tSU;STA requirements in Standard-mode on the system I tested on. The second rule is probably enough to meet tHD;STA requirements in nearly all cases (especially after accounting for the first), but it doesn't hurt to account for it anyway just in case. Even though the repeated start requirement only need to be accounted for during a small part of the transfer, we'll adjust the timings for the whole transfer to meet it. I believe that adjusting the timings in just the right place to switch things up for repeated start would require several extra interrupts and that doesn't seem terribly worth it. With this change and worst case rise/fall times, I see 100kHz i2c going to ~85kHz. With slightly optimized rise/fall (800ns / 50ns) I see i2c going to ~89kHz. Fast-mode isn't affected much because tSU;STA is shorter relative to tHD;STA there. As part of this change we needed to account for the SDA falling time. The specification indicates that this should be the same, but we'll follow Designware's lead and add a binding. Note that we deviate from Designware and assign the default SDA falling time to be the same as the SCL falling time, which is incredibly likely. Signed-off-by: Doug Anderson <dianders@chromium.org> [wsa: rebased to i2c/for-next] Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
57 lines
1.7 KiB
Plaintext
57 lines
1.7 KiB
Plaintext
* Rockchip RK3xxx I2C controller
|
|
|
|
This driver interfaces with the native I2C controller present in Rockchip
|
|
RK3xxx SoCs.
|
|
|
|
Required properties :
|
|
|
|
- reg : Offset and length of the register set for the device
|
|
- compatible : should be "rockchip,rk3066-i2c", "rockchip,rk3188-i2c" or
|
|
"rockchip,rk3288-i2c".
|
|
- interrupts : interrupt number
|
|
- clocks : parent clock
|
|
|
|
Required on RK3066, RK3188 :
|
|
|
|
- rockchip,grf : the phandle of the syscon node for the general register
|
|
file (GRF)
|
|
- on those SoCs an alias with the correct I2C bus ID (bit offset in the GRF)
|
|
is also required.
|
|
|
|
Optional properties :
|
|
|
|
- clock-frequency : SCL frequency to use (in Hz). If omitted, 100kHz is used.
|
|
- i2c-scl-rising-time-ns : Number of nanoseconds the SCL signal takes to rise
|
|
(t(r) in I2C specification). If not specified this is assumed to be
|
|
the maximum the specification allows(1000 ns for Standard-mode,
|
|
300 ns for Fast-mode) which might cause slightly slower communication.
|
|
- i2c-scl-falling-time-ns : Number of nanoseconds the SCL signal takes to fall
|
|
(t(f) in the I2C specification). If not specified this is assumed to
|
|
be the maximum the specification allows (300 ns) which might cause
|
|
slightly slower communication.
|
|
- i2c-sda-falling-time-ns : Number of nanoseconds the SDA signal takes to fall
|
|
(t(f) in the I2C specification). If not specified we'll use the SCL
|
|
value since they are the same in nearly all cases.
|
|
|
|
Example:
|
|
|
|
aliases {
|
|
i2c0 = &i2c0;
|
|
}
|
|
|
|
i2c0: i2c@2002d000 {
|
|
compatible = "rockchip,rk3188-i2c";
|
|
reg = <0x2002d000 0x1000>;
|
|
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
|
|
rockchip,grf = <&grf>;
|
|
|
|
clock-names = "i2c";
|
|
clocks = <&cru PCLK_I2C0>;
|
|
|
|
i2c-scl-rising-time-ns = <800>;
|
|
i2c-scl-falling-time-ns = <100>;
|
|
};
|