|
34 | 34 | #define REG_CTRL_ACK_IGNORE BIT(1)
|
35 | 35 | #define REG_CTRL_STATUS BIT(2)
|
36 | 36 | #define REG_CTRL_ERROR BIT(3)
|
37 |
| -#define REG_CTRL_CLKDIV_SHIFT 12 |
38 |
| -#define REG_CTRL_CLKDIV_MASK GENMASK(21, 12) |
39 |
| -#define REG_CTRL_CLKDIVEXT_SHIFT 28 |
40 |
| -#define REG_CTRL_CLKDIVEXT_MASK GENMASK(29, 28) |
| 37 | +#define REG_CTRL_CLKDIV GENMASK(21, 12) |
| 38 | +#define REG_CTRL_CLKDIVEXT GENMASK(29, 28) |
41 | 39 |
|
42 | 40 | #define REG_SLV_ADDR GENMASK(7, 0)
|
43 | 41 | #define REG_SLV_SDA_FILTER GENMASK(10, 8)
|
|
46 | 44 | #define REG_SLV_SCL_LOW_EN BIT(28)
|
47 | 45 |
|
48 | 46 | #define I2C_TIMEOUT_MS 500
|
| 47 | +#define FILTER_DELAY 15 |
49 | 48 |
|
50 | 49 | enum {
|
51 | 50 | TOKEN_END = 0,
|
@@ -140,19 +139,21 @@ static void meson_i2c_set_clk_div(struct meson_i2c *i2c, unsigned int freq)
|
140 | 139 | unsigned long clk_rate = clk_get_rate(i2c->clk);
|
141 | 140 | unsigned int div;
|
142 | 141 |
|
143 |
| - div = DIV_ROUND_UP(clk_rate, freq * i2c->data->div_factor); |
| 142 | + div = DIV_ROUND_UP(clk_rate, freq); |
| 143 | + div -= FILTER_DELAY; |
| 144 | + div = DIV_ROUND_UP(div, i2c->data->div_factor); |
144 | 145 |
|
145 | 146 | /* clock divider has 12 bits */
|
146 |
| - if (div >= (1 << 12)) { |
| 147 | + if (div > GENMASK(11, 0)) { |
147 | 148 | dev_err(i2c->dev, "requested bus frequency too low\n");
|
148 |
| - div = (1 << 12) - 1; |
| 149 | + div = GENMASK(11, 0); |
149 | 150 | }
|
150 | 151 |
|
151 |
| - meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_CLKDIV_MASK, |
152 |
| - (div & GENMASK(9, 0)) << REG_CTRL_CLKDIV_SHIFT); |
| 152 | + meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_CLKDIV, |
| 153 | + FIELD_PREP(REG_CTRL_CLKDIV, div & GENMASK(9, 0))); |
153 | 154 |
|
154 |
| - meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_CLKDIVEXT_MASK, |
155 |
| - (div >> 10) << REG_CTRL_CLKDIVEXT_SHIFT); |
| 155 | + meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_CLKDIVEXT, |
| 156 | + FIELD_PREP(REG_CTRL_CLKDIVEXT, div >> 10)); |
156 | 157 |
|
157 | 158 | /* Disable HIGH/LOW mode */
|
158 | 159 | meson_i2c_set_mask(i2c, REG_SLAVE_ADDR, REG_SLV_SCL_LOW_EN, 0);
|
|
0 commit comments