1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Driver for I2C adapter in Rockchip RK3xxx SoC
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Max Schwarz <max.schwarz@online.de>
6*4882a593Smuzhiyun * based on the patches by Rockchip Inc.
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <linux/acpi.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/i2c.h>
13*4882a593Smuzhiyun #include <linux/interrupt.h>
14*4882a593Smuzhiyun #include <linux/iopoll.h>
15*4882a593Smuzhiyun #include <linux/errno.h>
16*4882a593Smuzhiyun #include <linux/err.h>
17*4882a593Smuzhiyun #include <linux/platform_device.h>
18*4882a593Smuzhiyun #include <linux/io.h>
19*4882a593Smuzhiyun #include <linux/of_address.h>
20*4882a593Smuzhiyun #include <linux/of_irq.h>
21*4882a593Smuzhiyun #include <linux/spinlock.h>
22*4882a593Smuzhiyun #include <linux/clk.h>
23*4882a593Smuzhiyun #include <linux/wait.h>
24*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
25*4882a593Smuzhiyun #include <linux/regmap.h>
26*4882a593Smuzhiyun #include <linux/math64.h>
27*4882a593Smuzhiyun #include <linux/reboot.h>
28*4882a593Smuzhiyun #include <linux/delay.h>
29*4882a593Smuzhiyun #include <linux/soc/rockchip/rockchip_thunderboot_service.h>
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Register Map */
33*4882a593Smuzhiyun #define REG_CON 0x00 /* control register */
34*4882a593Smuzhiyun #define REG_CLKDIV 0x04 /* clock divisor register */
35*4882a593Smuzhiyun #define REG_MRXADDR 0x08 /* slave address for REGISTER_TX */
36*4882a593Smuzhiyun #define REG_MRXRADDR 0x0c /* slave register address for REGISTER_TX */
37*4882a593Smuzhiyun #define REG_MTXCNT 0x10 /* number of bytes to be transmitted */
38*4882a593Smuzhiyun #define REG_MRXCNT 0x14 /* number of bytes to be received */
39*4882a593Smuzhiyun #define REG_IEN 0x18 /* interrupt enable */
40*4882a593Smuzhiyun #define REG_IPD 0x1c /* interrupt pending */
41*4882a593Smuzhiyun #define REG_FCNT 0x20 /* finished count */
42*4882a593Smuzhiyun #define REG_CON1 0x228 /* control register1 */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* Data buffer offsets */
45*4882a593Smuzhiyun #define TXBUFFER_BASE 0x100
46*4882a593Smuzhiyun #define RXBUFFER_BASE 0x200
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun /* REG_CON bits */
49*4882a593Smuzhiyun #define REG_CON_EN BIT(0)
50*4882a593Smuzhiyun enum {
51*4882a593Smuzhiyun REG_CON_MOD_TX = 0, /* transmit data */
52*4882a593Smuzhiyun REG_CON_MOD_REGISTER_TX, /* select register and restart */
53*4882a593Smuzhiyun REG_CON_MOD_RX, /* receive data */
54*4882a593Smuzhiyun REG_CON_MOD_REGISTER_RX, /* broken: transmits read addr AND writes
55*4882a593Smuzhiyun * register addr */
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun #define REG_CON_MOD(mod) ((mod) << 1)
58*4882a593Smuzhiyun #define REG_CON_MOD_MASK (BIT(1) | BIT(2))
59*4882a593Smuzhiyun #define REG_CON_START BIT(3)
60*4882a593Smuzhiyun #define REG_CON_STOP BIT(4)
61*4882a593Smuzhiyun #define REG_CON_LASTACK BIT(5) /* 1: send NACK after last received byte */
62*4882a593Smuzhiyun #define REG_CON_ACTACK BIT(6) /* 1: stop if NACK is received */
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun #define REG_CON_TUNING_MASK GENMASK_ULL(15, 8)
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #define REG_CON_SDA_CFG(cfg) ((cfg) << 8)
67*4882a593Smuzhiyun #define REG_CON_STA_CFG(cfg) ((cfg) << 12)
68*4882a593Smuzhiyun #define REG_CON_STO_CFG(cfg) ((cfg) << 14)
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun enum {
71*4882a593Smuzhiyun RK_I2C_VERSION0 = 0,
72*4882a593Smuzhiyun RK_I2C_VERSION1,
73*4882a593Smuzhiyun RK_I2C_VERSION5 = 5,
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #define REG_CON_VERSION GENMASK_ULL(24, 16)
77*4882a593Smuzhiyun #define REG_CON_VERSION_SHIFT 16
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun /* REG_MRXADDR bits */
80*4882a593Smuzhiyun #define REG_MRXADDR_VALID(x) BIT(24 + (x)) /* [x*8+7:x*8] of MRX[R]ADDR valid */
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* REG_IEN/REG_IPD bits */
83*4882a593Smuzhiyun #define REG_INT_BTF BIT(0) /* a byte was transmitted */
84*4882a593Smuzhiyun #define REG_INT_BRF BIT(1) /* a byte was received */
85*4882a593Smuzhiyun #define REG_INT_MBTF BIT(2) /* master data transmit finished */
86*4882a593Smuzhiyun #define REG_INT_MBRF BIT(3) /* master data receive finished */
87*4882a593Smuzhiyun #define REG_INT_START BIT(4) /* START condition generated */
88*4882a593Smuzhiyun #define REG_INT_STOP BIT(5) /* STOP condition generated */
89*4882a593Smuzhiyun #define REG_INT_NAKRCV BIT(6) /* NACK received */
90*4882a593Smuzhiyun #define REG_INT_ALL 0xff
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /* Disable i2c all irqs */
93*4882a593Smuzhiyun #define IEN_ALL_DISABLE 0
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun #define REG_CON1_AUTO_STOP BIT(0)
96*4882a593Smuzhiyun #define REG_CON1_TRANSFER_AUTO_STOP BIT(1)
97*4882a593Smuzhiyun #define REG_CON1_NACK_AUTO_STOP BIT(2)
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun /* Constants */
100*4882a593Smuzhiyun #define WAIT_TIMEOUT 1000 /* ms */
101*4882a593Smuzhiyun #define DEFAULT_SCL_RATE (100 * 1000) /* Hz */
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun /**
104*4882a593Smuzhiyun * struct i2c_spec_values:
105*4882a593Smuzhiyun * @min_hold_start_ns: min hold time (repeated) START condition
106*4882a593Smuzhiyun * @min_low_ns: min LOW period of the SCL clock
107*4882a593Smuzhiyun * @min_high_ns: min HIGH period of the SCL cloc
108*4882a593Smuzhiyun * @min_setup_start_ns: min set-up time for a repeated START conditio
109*4882a593Smuzhiyun * @max_data_hold_ns: max data hold time
110*4882a593Smuzhiyun * @min_data_setup_ns: min data set-up time
111*4882a593Smuzhiyun * @min_setup_stop_ns: min set-up time for STOP condition
112*4882a593Smuzhiyun * @min_hold_buffer_ns: min bus free time between a STOP and
113*4882a593Smuzhiyun * START condition
114*4882a593Smuzhiyun */
115*4882a593Smuzhiyun struct i2c_spec_values {
116*4882a593Smuzhiyun unsigned long min_hold_start_ns;
117*4882a593Smuzhiyun unsigned long min_low_ns;
118*4882a593Smuzhiyun unsigned long min_high_ns;
119*4882a593Smuzhiyun unsigned long min_setup_start_ns;
120*4882a593Smuzhiyun unsigned long max_data_hold_ns;
121*4882a593Smuzhiyun unsigned long min_data_setup_ns;
122*4882a593Smuzhiyun unsigned long min_setup_stop_ns;
123*4882a593Smuzhiyun unsigned long min_hold_buffer_ns;
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun static const struct i2c_spec_values standard_mode_spec = {
127*4882a593Smuzhiyun .min_hold_start_ns = 4000,
128*4882a593Smuzhiyun .min_low_ns = 4700,
129*4882a593Smuzhiyun .min_high_ns = 4000,
130*4882a593Smuzhiyun .min_setup_start_ns = 4700,
131*4882a593Smuzhiyun .max_data_hold_ns = 3450,
132*4882a593Smuzhiyun .min_data_setup_ns = 250,
133*4882a593Smuzhiyun .min_setup_stop_ns = 4000,
134*4882a593Smuzhiyun .min_hold_buffer_ns = 4700,
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun static const struct i2c_spec_values fast_mode_spec = {
138*4882a593Smuzhiyun .min_hold_start_ns = 600,
139*4882a593Smuzhiyun .min_low_ns = 1300,
140*4882a593Smuzhiyun .min_high_ns = 600,
141*4882a593Smuzhiyun .min_setup_start_ns = 600,
142*4882a593Smuzhiyun .max_data_hold_ns = 900,
143*4882a593Smuzhiyun .min_data_setup_ns = 100,
144*4882a593Smuzhiyun .min_setup_stop_ns = 600,
145*4882a593Smuzhiyun .min_hold_buffer_ns = 1300,
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun static const struct i2c_spec_values fast_mode_plus_spec = {
149*4882a593Smuzhiyun .min_hold_start_ns = 260,
150*4882a593Smuzhiyun .min_low_ns = 500,
151*4882a593Smuzhiyun .min_high_ns = 260,
152*4882a593Smuzhiyun .min_setup_start_ns = 260,
153*4882a593Smuzhiyun .max_data_hold_ns = 400,
154*4882a593Smuzhiyun .min_data_setup_ns = 50,
155*4882a593Smuzhiyun .min_setup_stop_ns = 260,
156*4882a593Smuzhiyun .min_hold_buffer_ns = 500,
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun /**
160*4882a593Smuzhiyun * struct rk3x_i2c_calced_timings:
161*4882a593Smuzhiyun * @div_low: Divider output for low
162*4882a593Smuzhiyun * @div_high: Divider output for high
163*4882a593Smuzhiyun * @tuning: Used to adjust setup/hold data time,
164*4882a593Smuzhiyun * setup/hold start time and setup stop time for
165*4882a593Smuzhiyun * v1's calc_timings, the tuning should all be 0
166*4882a593Smuzhiyun * for old hardware anyone using v0's calc_timings.
167*4882a593Smuzhiyun */
168*4882a593Smuzhiyun struct rk3x_i2c_calced_timings {
169*4882a593Smuzhiyun unsigned long div_low;
170*4882a593Smuzhiyun unsigned long div_high;
171*4882a593Smuzhiyun unsigned int tuning;
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun enum rk3x_i2c_state {
175*4882a593Smuzhiyun STATE_IDLE,
176*4882a593Smuzhiyun STATE_READ,
177*4882a593Smuzhiyun STATE_WRITE,
178*4882a593Smuzhiyun STATE_STOP
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun /**
182*4882a593Smuzhiyun * struct rk3x_i2c_soc_data:
183*4882a593Smuzhiyun * @grf_offset: offset inside the grf regmap for setting the i2c type
184*4882a593Smuzhiyun * @calc_timings: Callback function for i2c timing information calculated
185*4882a593Smuzhiyun */
186*4882a593Smuzhiyun struct rk3x_i2c_soc_data {
187*4882a593Smuzhiyun int grf_offset;
188*4882a593Smuzhiyun int (*calc_timings)(unsigned long, struct i2c_timings *,
189*4882a593Smuzhiyun struct rk3x_i2c_calced_timings *);
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun /**
193*4882a593Smuzhiyun * struct rk3x_i2c - private data of the controller
194*4882a593Smuzhiyun * @adap: corresponding I2C adapter
195*4882a593Smuzhiyun * @dev: device for this controller
196*4882a593Smuzhiyun * @soc_data: related soc data struct
197*4882a593Smuzhiyun * @regs: virtual memory area
198*4882a593Smuzhiyun * @clk: function clk for rk3399 or function & Bus clks for others
199*4882a593Smuzhiyun * @pclk: Bus clk for rk3399
200*4882a593Smuzhiyun * @clk_rate_nb: i2c clk rate change notify
201*4882a593Smuzhiyun * @t: I2C known timing information
202*4882a593Smuzhiyun * @lock: spinlock for the i2c bus
203*4882a593Smuzhiyun * @wait: the waitqueue to wait for i2c transfer
204*4882a593Smuzhiyun * @busy: the condition for the event to wait for
205*4882a593Smuzhiyun * @msg: current i2c message
206*4882a593Smuzhiyun * @addr: addr of i2c slave device
207*4882a593Smuzhiyun * @mode: mode of i2c transfer
208*4882a593Smuzhiyun * @is_last_msg: flag determines whether it is the last msg in this transfer
209*4882a593Smuzhiyun * @state: state of i2c transfer
210*4882a593Smuzhiyun * @processed: byte length which has been send or received
211*4882a593Smuzhiyun * @error: error code for i2c transfer
212*4882a593Smuzhiyun * @i2c_restart_nb: make sure the i2c transfer to be finished
213*4882a593Smuzhiyun * @system_restarting: true if system is restarting
214*4882a593Smuzhiyun * @tb_cl: client for rockchip thunder boot service
215*4882a593Smuzhiyun */
216*4882a593Smuzhiyun struct rk3x_i2c {
217*4882a593Smuzhiyun struct i2c_adapter adap;
218*4882a593Smuzhiyun struct device *dev;
219*4882a593Smuzhiyun const struct rk3x_i2c_soc_data *soc_data;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun /* Hardware resources */
222*4882a593Smuzhiyun void __iomem *regs;
223*4882a593Smuzhiyun struct clk *clk;
224*4882a593Smuzhiyun struct clk *pclk;
225*4882a593Smuzhiyun struct notifier_block clk_rate_nb;
226*4882a593Smuzhiyun bool autostop_supported;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /* Settings */
229*4882a593Smuzhiyun struct i2c_timings t;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun /* Synchronization & notification */
232*4882a593Smuzhiyun spinlock_t lock;
233*4882a593Smuzhiyun wait_queue_head_t wait;
234*4882a593Smuzhiyun bool busy;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun /* Current message */
237*4882a593Smuzhiyun struct i2c_msg *msg;
238*4882a593Smuzhiyun u8 addr;
239*4882a593Smuzhiyun unsigned int mode;
240*4882a593Smuzhiyun bool is_last_msg;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun /* I2C state machine */
243*4882a593Smuzhiyun enum rk3x_i2c_state state;
244*4882a593Smuzhiyun unsigned int processed;
245*4882a593Smuzhiyun int error;
246*4882a593Smuzhiyun unsigned int suspended:1;
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun struct notifier_block i2c_restart_nb;
249*4882a593Smuzhiyun bool system_restarting;
250*4882a593Smuzhiyun struct rk_tb_client tb_cl;
251*4882a593Smuzhiyun int irq;
252*4882a593Smuzhiyun };
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c);
255*4882a593Smuzhiyun static int rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c, bool sended);
256*4882a593Smuzhiyun
rk3x_i2c_wake_up(struct rk3x_i2c * i2c)257*4882a593Smuzhiyun static inline void rk3x_i2c_wake_up(struct rk3x_i2c *i2c)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun if (!i2c->system_restarting)
260*4882a593Smuzhiyun wake_up(&i2c->wait);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
i2c_writel(struct rk3x_i2c * i2c,u32 value,unsigned int offset)263*4882a593Smuzhiyun static inline void i2c_writel(struct rk3x_i2c *i2c, u32 value,
264*4882a593Smuzhiyun unsigned int offset)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun writel(value, i2c->regs + offset);
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
i2c_readl(struct rk3x_i2c * i2c,unsigned int offset)269*4882a593Smuzhiyun static inline u32 i2c_readl(struct rk3x_i2c *i2c, unsigned int offset)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun return readl(i2c->regs + offset);
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun /* Reset all interrupt pending bits */
rk3x_i2c_clean_ipd(struct rk3x_i2c * i2c)275*4882a593Smuzhiyun static inline void rk3x_i2c_clean_ipd(struct rk3x_i2c *i2c)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_ALL, REG_IPD);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
rk3x_i2c_disable_irq(struct rk3x_i2c * i2c)280*4882a593Smuzhiyun static inline void rk3x_i2c_disable_irq(struct rk3x_i2c *i2c)
281*4882a593Smuzhiyun {
282*4882a593Smuzhiyun i2c_writel(i2c, IEN_ALL_DISABLE, REG_IEN);
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun
rk3x_i2c_disable(struct rk3x_i2c * i2c)285*4882a593Smuzhiyun static inline void rk3x_i2c_disable(struct rk3x_i2c *i2c)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun u32 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun i2c_writel(i2c, val, REG_CON);
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun
rk3x_i2c_auto_stop(struct rk3x_i2c * i2c)292*4882a593Smuzhiyun static bool rk3x_i2c_auto_stop(struct rk3x_i2c *i2c)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun unsigned int len, con1 = 0;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun if (!i2c->autostop_supported)
297*4882a593Smuzhiyun return false;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun if (!(i2c->msg->flags & I2C_M_IGNORE_NAK))
300*4882a593Smuzhiyun con1 = REG_CON1_NACK_AUTO_STOP | REG_CON1_AUTO_STOP;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (!i2c->is_last_msg)
303*4882a593Smuzhiyun goto out;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun len = i2c->msg->len - i2c->processed;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun if (len > 32)
308*4882a593Smuzhiyun goto out;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun i2c->state = STATE_STOP;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun con1 |= REG_CON1_TRANSFER_AUTO_STOP | REG_CON1_AUTO_STOP;
313*4882a593Smuzhiyun i2c_writel(i2c, con1, REG_CON1);
314*4882a593Smuzhiyun if (con1 & REG_CON1_NACK_AUTO_STOP)
315*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_STOP, REG_IEN);
316*4882a593Smuzhiyun else
317*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_STOP | REG_INT_NAKRCV, REG_IEN);
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun return true;
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun out:
322*4882a593Smuzhiyun i2c_writel(i2c, con1, REG_CON1);
323*4882a593Smuzhiyun return false;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun /**
327*4882a593Smuzhiyun * Generate a START condition, which triggers a REG_INT_START interrupt.
328*4882a593Smuzhiyun */
rk3x_i2c_start(struct rk3x_i2c * i2c)329*4882a593Smuzhiyun static void rk3x_i2c_start(struct rk3x_i2c *i2c)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun u32 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK;
332*4882a593Smuzhiyun bool auto_stop = rk3x_i2c_auto_stop(i2c);
333*4882a593Smuzhiyun int length = 0;
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun /* enable appropriate interrupts */
336*4882a593Smuzhiyun if (i2c->mode == REG_CON_MOD_TX) {
337*4882a593Smuzhiyun if (!auto_stop) {
338*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_MBTF | REG_INT_NAKRCV, REG_IEN);
339*4882a593Smuzhiyun i2c->state = STATE_WRITE;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun length = rk3x_i2c_fill_transmit_buf(i2c, false);
342*4882a593Smuzhiyun } else {
343*4882a593Smuzhiyun /* in any other case, we are going to be reading. */
344*4882a593Smuzhiyun if (!auto_stop) {
345*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_MBRF | REG_INT_NAKRCV, REG_IEN);
346*4882a593Smuzhiyun i2c->state = STATE_READ;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /* enable adapter with correct mode, send START condition */
351*4882a593Smuzhiyun val |= REG_CON_EN | REG_CON_MOD(i2c->mode) | REG_CON_START;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun /* if we want to react to NACK, set ACTACK bit */
354*4882a593Smuzhiyun if (!(i2c->msg->flags & I2C_M_IGNORE_NAK))
355*4882a593Smuzhiyun val |= REG_CON_ACTACK;
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun i2c_writel(i2c, val, REG_CON);
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun /* enable transition */
360*4882a593Smuzhiyun if (i2c->mode == REG_CON_MOD_TX)
361*4882a593Smuzhiyun i2c_writel(i2c, length, REG_MTXCNT);
362*4882a593Smuzhiyun else
363*4882a593Smuzhiyun rk3x_i2c_prepare_read(i2c);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /**
367*4882a593Smuzhiyun * Generate a STOP condition, which triggers a REG_INT_STOP interrupt.
368*4882a593Smuzhiyun *
369*4882a593Smuzhiyun * @error: Error code to return in rk3x_i2c_xfer
370*4882a593Smuzhiyun */
rk3x_i2c_stop(struct rk3x_i2c * i2c,int error)371*4882a593Smuzhiyun static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error)
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun unsigned int ctrl;
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun i2c->processed = 0;
376*4882a593Smuzhiyun i2c->msg = NULL;
377*4882a593Smuzhiyun i2c->error = error;
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun if (i2c->is_last_msg) {
380*4882a593Smuzhiyun /* Enable stop interrupt */
381*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_STOP, REG_IEN);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun i2c->state = STATE_STOP;
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun ctrl = i2c_readl(i2c, REG_CON);
386*4882a593Smuzhiyun ctrl |= REG_CON_STOP;
387*4882a593Smuzhiyun ctrl &= ~REG_CON_START;
388*4882a593Smuzhiyun i2c_writel(i2c, ctrl, REG_CON);
389*4882a593Smuzhiyun } else {
390*4882a593Smuzhiyun /* Signal rk3x_i2c_xfer to start the next message. */
391*4882a593Smuzhiyun i2c->busy = false;
392*4882a593Smuzhiyun i2c->state = STATE_IDLE;
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun /*
395*4882a593Smuzhiyun * The HW is actually not capable of REPEATED START. But we can
396*4882a593Smuzhiyun * get the intended effect by resetting its internal state
397*4882a593Smuzhiyun * and issuing an ordinary START.
398*4882a593Smuzhiyun */
399*4882a593Smuzhiyun ctrl = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK;
400*4882a593Smuzhiyun i2c_writel(i2c, ctrl, REG_CON);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun /* signal that we are finished with the current msg */
403*4882a593Smuzhiyun rk3x_i2c_wake_up(i2c);
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun /**
408*4882a593Smuzhiyun * Setup a read according to i2c->msg
409*4882a593Smuzhiyun */
rk3x_i2c_prepare_read(struct rk3x_i2c * i2c)410*4882a593Smuzhiyun static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun unsigned int len = i2c->msg->len - i2c->processed;
413*4882a593Smuzhiyun u32 con;
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun con = i2c_readl(i2c, REG_CON);
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun /*
418*4882a593Smuzhiyun * The hw can read up to 32 bytes at a time. If we need more than one
419*4882a593Smuzhiyun * chunk, send an ACK after the last byte of the current chunk.
420*4882a593Smuzhiyun */
421*4882a593Smuzhiyun if (len > 32) {
422*4882a593Smuzhiyun len = 32;
423*4882a593Smuzhiyun con &= ~REG_CON_LASTACK;
424*4882a593Smuzhiyun } else {
425*4882a593Smuzhiyun con |= REG_CON_LASTACK;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun /* make sure we are in plain RX mode if we read a second chunk */
429*4882a593Smuzhiyun if (i2c->processed != 0) {
430*4882a593Smuzhiyun con &= ~REG_CON_MOD_MASK;
431*4882a593Smuzhiyun con |= REG_CON_MOD(REG_CON_MOD_RX);
432*4882a593Smuzhiyun if (con & REG_CON_START)
433*4882a593Smuzhiyun con &= ~REG_CON_START;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun i2c_writel(i2c, con, REG_CON);
437*4882a593Smuzhiyun i2c_writel(i2c, len, REG_MRXCNT);
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun /**
441*4882a593Smuzhiyun * Fill the transmit buffer with data from i2c->msg
442*4882a593Smuzhiyun */
rk3x_i2c_fill_transmit_buf(struct rk3x_i2c * i2c,bool sendend)443*4882a593Smuzhiyun static int rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c, bool sendend)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun unsigned int i, j;
446*4882a593Smuzhiyun u32 cnt = 0;
447*4882a593Smuzhiyun u32 val;
448*4882a593Smuzhiyun u8 byte;
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun for (i = 0; i < 8; ++i) {
451*4882a593Smuzhiyun val = 0;
452*4882a593Smuzhiyun for (j = 0; j < 4; ++j) {
453*4882a593Smuzhiyun if ((i2c->processed == i2c->msg->len) && (cnt != 0))
454*4882a593Smuzhiyun break;
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun if (i2c->processed == 0 && cnt == 0)
457*4882a593Smuzhiyun byte = (i2c->addr & 0x7f) << 1;
458*4882a593Smuzhiyun else
459*4882a593Smuzhiyun byte = i2c->msg->buf[i2c->processed++];
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun val |= byte << (j * 8);
462*4882a593Smuzhiyun cnt++;
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun i2c_writel(i2c, val, TXBUFFER_BASE + 4 * i);
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun if (i2c->processed == i2c->msg->len)
468*4882a593Smuzhiyun break;
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun if (sendend)
472*4882a593Smuzhiyun i2c_writel(i2c, cnt, REG_MTXCNT);
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun return cnt;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun /* IRQ handlers for individual states */
479*4882a593Smuzhiyun
rk3x_i2c_handle_write(struct rk3x_i2c * i2c,unsigned int ipd)480*4882a593Smuzhiyun static void rk3x_i2c_handle_write(struct rk3x_i2c *i2c, unsigned int ipd)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun if (!(ipd & REG_INT_MBTF)) {
483*4882a593Smuzhiyun rk3x_i2c_stop(i2c, -EIO);
484*4882a593Smuzhiyun dev_warn_ratelimited(i2c->dev, "unexpected irq in WRITE: 0x%x\n", ipd);
485*4882a593Smuzhiyun rk3x_i2c_clean_ipd(i2c);
486*4882a593Smuzhiyun return;
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun /* ack interrupt */
490*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_MBTF, REG_IPD);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun rk3x_i2c_auto_stop(i2c);
493*4882a593Smuzhiyun /* are we finished? */
494*4882a593Smuzhiyun if (i2c->processed == i2c->msg->len)
495*4882a593Smuzhiyun rk3x_i2c_stop(i2c, i2c->error);
496*4882a593Smuzhiyun else
497*4882a593Smuzhiyun rk3x_i2c_fill_transmit_buf(i2c, true);
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
rk3x_i2c_read(struct rk3x_i2c * i2c)500*4882a593Smuzhiyun static void rk3x_i2c_read(struct rk3x_i2c *i2c)
501*4882a593Smuzhiyun {
502*4882a593Smuzhiyun unsigned int i;
503*4882a593Smuzhiyun unsigned int len = i2c->msg->len - i2c->processed;
504*4882a593Smuzhiyun u32 val;
505*4882a593Smuzhiyun u8 byte;
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun /* Can only handle a maximum of 32 bytes at a time */
508*4882a593Smuzhiyun if (len > 32)
509*4882a593Smuzhiyun len = 32;
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun /* read the data from receive buffer */
512*4882a593Smuzhiyun for (i = 0; i < len; ++i) {
513*4882a593Smuzhiyun if (i % 4 == 0)
514*4882a593Smuzhiyun val = i2c_readl(i2c, RXBUFFER_BASE + (i / 4) * 4);
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun byte = (val >> ((i % 4) * 8)) & 0xff;
517*4882a593Smuzhiyun i2c->msg->buf[i2c->processed++] = byte;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun }
520*4882a593Smuzhiyun
rk3x_i2c_handle_read(struct rk3x_i2c * i2c,unsigned int ipd)521*4882a593Smuzhiyun static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun /* we only care for MBRF here. */
524*4882a593Smuzhiyun if (!(ipd & REG_INT_MBRF))
525*4882a593Smuzhiyun return;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun /* ack interrupt (read also produces a spurious START flag, clear it too) */
528*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD);
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun /* read the data from receive buffer */
531*4882a593Smuzhiyun rk3x_i2c_read(i2c);
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun rk3x_i2c_auto_stop(i2c);
534*4882a593Smuzhiyun /* are we finished? */
535*4882a593Smuzhiyun if (i2c->processed == i2c->msg->len)
536*4882a593Smuzhiyun rk3x_i2c_stop(i2c, i2c->error);
537*4882a593Smuzhiyun else
538*4882a593Smuzhiyun rk3x_i2c_prepare_read(i2c);
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun
rk3x_i2c_handle_stop(struct rk3x_i2c * i2c,unsigned int ipd)541*4882a593Smuzhiyun static void rk3x_i2c_handle_stop(struct rk3x_i2c *i2c, unsigned int ipd)
542*4882a593Smuzhiyun {
543*4882a593Smuzhiyun unsigned int con;
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun if (!(ipd & REG_INT_STOP)) {
546*4882a593Smuzhiyun rk3x_i2c_stop(i2c, -EIO);
547*4882a593Smuzhiyun dev_warn_ratelimited(i2c->dev, "unexpected irq in STOP: 0x%x\n", ipd);
548*4882a593Smuzhiyun rk3x_i2c_clean_ipd(i2c);
549*4882a593Smuzhiyun return;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun if (i2c->autostop_supported && !i2c->error) {
553*4882a593Smuzhiyun if (i2c->mode != REG_CON_MOD_TX && i2c->msg) {
554*4882a593Smuzhiyun if ((i2c->msg->len - i2c->processed) > 0)
555*4882a593Smuzhiyun rk3x_i2c_read(i2c);
556*4882a593Smuzhiyun }
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun i2c->processed = 0;
559*4882a593Smuzhiyun i2c->msg = NULL;
560*4882a593Smuzhiyun }
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun /* ack interrupt */
563*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_STOP, REG_IPD);
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun /* disable STOP bit */
566*4882a593Smuzhiyun con = i2c_readl(i2c, REG_CON);
567*4882a593Smuzhiyun con &= ~REG_CON_STOP;
568*4882a593Smuzhiyun if (i2c->autostop_supported)
569*4882a593Smuzhiyun con &= ~REG_CON_START;
570*4882a593Smuzhiyun i2c_writel(i2c, con, REG_CON);
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun i2c->busy = false;
573*4882a593Smuzhiyun i2c->state = STATE_IDLE;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun /* signal rk3x_i2c_xfer that we are finished */
576*4882a593Smuzhiyun rk3x_i2c_wake_up(i2c);
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun
rk3x_i2c_irq(int irqno,void * dev_id)579*4882a593Smuzhiyun static irqreturn_t rk3x_i2c_irq(int irqno, void *dev_id)
580*4882a593Smuzhiyun {
581*4882a593Smuzhiyun struct rk3x_i2c *i2c = dev_id;
582*4882a593Smuzhiyun unsigned int ipd;
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun spin_lock(&i2c->lock);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun ipd = i2c_readl(i2c, REG_IPD);
587*4882a593Smuzhiyun if (i2c->state == STATE_IDLE) {
588*4882a593Smuzhiyun dev_warn_ratelimited(i2c->dev,
589*4882a593Smuzhiyun "irq in STATE_IDLE, ipd = 0x%x\n",
590*4882a593Smuzhiyun ipd);
591*4882a593Smuzhiyun rk3x_i2c_clean_ipd(i2c);
592*4882a593Smuzhiyun goto out;
593*4882a593Smuzhiyun }
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun dev_dbg(i2c->dev, "IRQ: state %d, ipd: %x\n", i2c->state, ipd);
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun /* Clean interrupt bits we don't care about */
598*4882a593Smuzhiyun ipd &= ~(REG_INT_BRF | REG_INT_BTF);
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun if (ipd & REG_INT_NAKRCV) {
601*4882a593Smuzhiyun /*
602*4882a593Smuzhiyun * We got a NACK in the last operation. Depending on whether
603*4882a593Smuzhiyun * IGNORE_NAK is set, we have to stop the operation and report
604*4882a593Smuzhiyun * an error.
605*4882a593Smuzhiyun */
606*4882a593Smuzhiyun i2c_writel(i2c, REG_INT_NAKRCV, REG_IPD);
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun ipd &= ~REG_INT_NAKRCV;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
611*4882a593Smuzhiyun if (i2c->autostop_supported) {
612*4882a593Smuzhiyun i2c->error = -ENXIO;
613*4882a593Smuzhiyun i2c->state = STATE_STOP;
614*4882a593Smuzhiyun } else {
615*4882a593Smuzhiyun rk3x_i2c_stop(i2c, -ENXIO);
616*4882a593Smuzhiyun goto out;
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun /* is there anything left to handle? */
622*4882a593Smuzhiyun if ((ipd & REG_INT_ALL) == 0)
623*4882a593Smuzhiyun goto out;
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun switch (i2c->state) {
626*4882a593Smuzhiyun case STATE_WRITE:
627*4882a593Smuzhiyun rk3x_i2c_handle_write(i2c, ipd);
628*4882a593Smuzhiyun break;
629*4882a593Smuzhiyun case STATE_READ:
630*4882a593Smuzhiyun rk3x_i2c_handle_read(i2c, ipd);
631*4882a593Smuzhiyun break;
632*4882a593Smuzhiyun case STATE_STOP:
633*4882a593Smuzhiyun rk3x_i2c_handle_stop(i2c, ipd);
634*4882a593Smuzhiyun break;
635*4882a593Smuzhiyun case STATE_IDLE:
636*4882a593Smuzhiyun break;
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun out:
640*4882a593Smuzhiyun spin_unlock(&i2c->lock);
641*4882a593Smuzhiyun return IRQ_HANDLED;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun /**
645*4882a593Smuzhiyun * Get timing values of I2C specification
646*4882a593Smuzhiyun *
647*4882a593Smuzhiyun * @speed: Desired SCL frequency
648*4882a593Smuzhiyun *
649*4882a593Smuzhiyun * Returns: Matched i2c spec values.
650*4882a593Smuzhiyun */
rk3x_i2c_get_spec(unsigned int speed)651*4882a593Smuzhiyun static const struct i2c_spec_values *rk3x_i2c_get_spec(unsigned int speed)
652*4882a593Smuzhiyun {
653*4882a593Smuzhiyun if (speed <= I2C_MAX_STANDARD_MODE_FREQ)
654*4882a593Smuzhiyun return &standard_mode_spec;
655*4882a593Smuzhiyun else if (speed <= I2C_MAX_FAST_MODE_FREQ)
656*4882a593Smuzhiyun return &fast_mode_spec;
657*4882a593Smuzhiyun else
658*4882a593Smuzhiyun return &fast_mode_plus_spec;
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun /**
662*4882a593Smuzhiyun * Calculate divider values for desired SCL frequency
663*4882a593Smuzhiyun *
664*4882a593Smuzhiyun * @clk_rate: I2C input clock rate
665*4882a593Smuzhiyun * @t: Known I2C timing information
666*4882a593Smuzhiyun * @t_calc: Caculated rk3x private timings that would be written into regs
667*4882a593Smuzhiyun *
668*4882a593Smuzhiyun * Returns: 0 on success, -EINVAL if the goal SCL rate is too slow. In that case
669*4882a593Smuzhiyun * a best-effort divider value is returned in divs. If the target rate is
670*4882a593Smuzhiyun * too high, we silently use the highest possible rate.
671*4882a593Smuzhiyun */
rk3x_i2c_v0_calc_timings(unsigned long clk_rate,struct i2c_timings * t,struct rk3x_i2c_calced_timings * t_calc)672*4882a593Smuzhiyun static int rk3x_i2c_v0_calc_timings(unsigned long clk_rate,
673*4882a593Smuzhiyun struct i2c_timings *t,
674*4882a593Smuzhiyun struct rk3x_i2c_calced_timings *t_calc)
675*4882a593Smuzhiyun {
676*4882a593Smuzhiyun unsigned long min_low_ns, min_high_ns;
677*4882a593Smuzhiyun unsigned long max_low_ns, min_total_ns;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun unsigned long clk_rate_khz, scl_rate_khz;
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun unsigned long min_low_div, min_high_div;
682*4882a593Smuzhiyun unsigned long max_low_div;
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun unsigned long min_div_for_hold, min_total_div;
685*4882a593Smuzhiyun unsigned long extra_div, extra_low_div, ideal_low_div;
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun unsigned long data_hold_buffer_ns = 50;
688*4882a593Smuzhiyun const struct i2c_spec_values *spec;
689*4882a593Smuzhiyun int ret = 0;
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun /* Only support standard-mode and fast-mode */
692*4882a593Smuzhiyun if (WARN_ON(t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ))
693*4882a593Smuzhiyun t->bus_freq_hz = I2C_MAX_FAST_MODE_FREQ;
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun /* prevent scl_rate_khz from becoming 0 */
696*4882a593Smuzhiyun if (WARN_ON(t->bus_freq_hz < 1000))
697*4882a593Smuzhiyun t->bus_freq_hz = 1000;
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun /*
700*4882a593Smuzhiyun * min_low_ns: The minimum number of ns we need to hold low to
701*4882a593Smuzhiyun * meet I2C specification, should include fall time.
702*4882a593Smuzhiyun * min_high_ns: The minimum number of ns we need to hold high to
703*4882a593Smuzhiyun * meet I2C specification, should include rise time.
704*4882a593Smuzhiyun * max_low_ns: The maximum number of ns we can hold low to meet
705*4882a593Smuzhiyun * I2C specification.
706*4882a593Smuzhiyun *
707*4882a593Smuzhiyun * Note: max_low_ns should be (maximum data hold time * 2 - buffer)
708*4882a593Smuzhiyun * This is because the i2c host on Rockchip holds the data line
709*4882a593Smuzhiyun * for half the low time.
710*4882a593Smuzhiyun */
711*4882a593Smuzhiyun spec = rk3x_i2c_get_spec(t->bus_freq_hz);
712*4882a593Smuzhiyun min_high_ns = t->scl_rise_ns + spec->min_high_ns;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun /*
715*4882a593Smuzhiyun * Timings for repeated start:
716*4882a593Smuzhiyun * - controller appears to drop SDA at .875x (7/8) programmed clk high.
717*4882a593Smuzhiyun * - controller appears to keep SCL high for 2x programmed clk high.
718*4882a593Smuzhiyun *
719*4882a593Smuzhiyun * We need to account for those rules in picking our "high" time so
720*4882a593Smuzhiyun * we meet tSU;STA and tHD;STA times.
721*4882a593Smuzhiyun */
722*4882a593Smuzhiyun min_high_ns = max(min_high_ns, DIV_ROUND_UP(
723*4882a593Smuzhiyun (t->scl_rise_ns + spec->min_setup_start_ns) * 1000, 875));
724*4882a593Smuzhiyun min_high_ns = max(min_high_ns, DIV_ROUND_UP(
725*4882a593Smuzhiyun (t->scl_rise_ns + spec->min_setup_start_ns + t->sda_fall_ns +
726*4882a593Smuzhiyun spec->min_high_ns), 2));
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun min_low_ns = t->scl_fall_ns + spec->min_low_ns;
729*4882a593Smuzhiyun max_low_ns = spec->max_data_hold_ns * 2 - data_hold_buffer_ns;
730*4882a593Smuzhiyun min_total_ns = min_low_ns + min_high_ns;
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun /* Adjust to avoid overflow */
733*4882a593Smuzhiyun clk_rate_khz = DIV_ROUND_UP(clk_rate, 1000);
734*4882a593Smuzhiyun scl_rate_khz = t->bus_freq_hz / 1000;
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun /*
737*4882a593Smuzhiyun * We need the total div to be >= this number
738*4882a593Smuzhiyun * so we don't clock too fast.
739*4882a593Smuzhiyun */
740*4882a593Smuzhiyun min_total_div = DIV_ROUND_UP(clk_rate_khz, scl_rate_khz * 8);
741*4882a593Smuzhiyun
742*4882a593Smuzhiyun /* These are the min dividers needed for min hold times. */
743*4882a593Smuzhiyun min_low_div = DIV_ROUND_UP(clk_rate_khz * min_low_ns, 8 * 1000000);
744*4882a593Smuzhiyun min_high_div = DIV_ROUND_UP(clk_rate_khz * min_high_ns, 8 * 1000000);
745*4882a593Smuzhiyun min_div_for_hold = (min_low_div + min_high_div);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun /*
748*4882a593Smuzhiyun * This is the maximum divider so we don't go over the maximum.
749*4882a593Smuzhiyun * We don't round up here (we round down) since this is a maximum.
750*4882a593Smuzhiyun */
751*4882a593Smuzhiyun max_low_div = clk_rate_khz * max_low_ns / (8 * 1000000);
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun if (min_low_div > max_low_div) {
754*4882a593Smuzhiyun WARN_ONCE(true,
755*4882a593Smuzhiyun "Conflicting, min_low_div %lu, max_low_div %lu\n",
756*4882a593Smuzhiyun min_low_div, max_low_div);
757*4882a593Smuzhiyun max_low_div = min_low_div;
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun if (min_div_for_hold > min_total_div) {
761*4882a593Smuzhiyun /*
762*4882a593Smuzhiyun * Time needed to meet hold requirements is important.
763*4882a593Smuzhiyun * Just use that.
764*4882a593Smuzhiyun */
765*4882a593Smuzhiyun t_calc->div_low = min_low_div;
766*4882a593Smuzhiyun t_calc->div_high = min_high_div;
767*4882a593Smuzhiyun } else {
768*4882a593Smuzhiyun /*
769*4882a593Smuzhiyun * We've got to distribute some time among the low and high
770*4882a593Smuzhiyun * so we don't run too fast.
771*4882a593Smuzhiyun */
772*4882a593Smuzhiyun extra_div = min_total_div - min_div_for_hold;
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun /*
775*4882a593Smuzhiyun * We'll try to split things up perfectly evenly,
776*4882a593Smuzhiyun * biasing slightly towards having a higher div
777*4882a593Smuzhiyun * for low (spend more time low).
778*4882a593Smuzhiyun */
779*4882a593Smuzhiyun ideal_low_div = DIV_ROUND_UP(clk_rate_khz * min_low_ns,
780*4882a593Smuzhiyun scl_rate_khz * 8 * min_total_ns);
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun /* Don't allow it to go over the maximum */
783*4882a593Smuzhiyun if (ideal_low_div > max_low_div)
784*4882a593Smuzhiyun ideal_low_div = max_low_div;
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun /*
787*4882a593Smuzhiyun * Handle when the ideal low div is going to take up
788*4882a593Smuzhiyun * more than we have.
789*4882a593Smuzhiyun */
790*4882a593Smuzhiyun if (ideal_low_div > min_low_div + extra_div)
791*4882a593Smuzhiyun ideal_low_div = min_low_div + extra_div;
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun /* Give low the "ideal" and give high whatever extra is left */
794*4882a593Smuzhiyun extra_low_div = ideal_low_div - min_low_div;
795*4882a593Smuzhiyun t_calc->div_low = ideal_low_div;
796*4882a593Smuzhiyun t_calc->div_high = min_high_div + (extra_div - extra_low_div);
797*4882a593Smuzhiyun }
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun /*
800*4882a593Smuzhiyun * Adjust to the fact that the hardware has an implicit "+1".
801*4882a593Smuzhiyun * NOTE: Above calculations always produce div_low > 0 and div_high > 0.
802*4882a593Smuzhiyun */
803*4882a593Smuzhiyun t_calc->div_low--;
804*4882a593Smuzhiyun t_calc->div_high--;
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun /* Give the tuning value 0, that would not update con register */
807*4882a593Smuzhiyun t_calc->tuning = 0;
808*4882a593Smuzhiyun /* Maximum divider supported by hw is 0xffff */
809*4882a593Smuzhiyun if (t_calc->div_low > 0xffff) {
810*4882a593Smuzhiyun t_calc->div_low = 0xffff;
811*4882a593Smuzhiyun ret = -EINVAL;
812*4882a593Smuzhiyun }
813*4882a593Smuzhiyun
814*4882a593Smuzhiyun if (t_calc->div_high > 0xffff) {
815*4882a593Smuzhiyun t_calc->div_high = 0xffff;
816*4882a593Smuzhiyun ret = -EINVAL;
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun return ret;
820*4882a593Smuzhiyun }
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun /**
823*4882a593Smuzhiyun * Calculate timing values for desired SCL frequency
824*4882a593Smuzhiyun *
825*4882a593Smuzhiyun * @clk_rate: I2C input clock rate
826*4882a593Smuzhiyun * @t: Known I2C timing information
827*4882a593Smuzhiyun * @t_calc: Caculated rk3x private timings that would be written into regs
828*4882a593Smuzhiyun *
829*4882a593Smuzhiyun * Returns: 0 on success, -EINVAL if the goal SCL rate is too slow. In that case
830*4882a593Smuzhiyun * a best-effort divider value is returned in divs. If the target rate is
831*4882a593Smuzhiyun * too high, we silently use the highest possible rate.
832*4882a593Smuzhiyun * The following formulas are v1's method to calculate timings.
833*4882a593Smuzhiyun *
834*4882a593Smuzhiyun * l = divl + 1;
835*4882a593Smuzhiyun * h = divh + 1;
836*4882a593Smuzhiyun * s = sda_update_config + 1;
837*4882a593Smuzhiyun * u = start_setup_config + 1;
838*4882a593Smuzhiyun * p = stop_setup_config + 1;
839*4882a593Smuzhiyun * T = Tclk_i2c;
840*4882a593Smuzhiyun *
841*4882a593Smuzhiyun * tHigh = 8 * h * T;
842*4882a593Smuzhiyun * tLow = 8 * l * T;
843*4882a593Smuzhiyun *
844*4882a593Smuzhiyun * tHD;sda = (l * s + 1) * T;
845*4882a593Smuzhiyun * tSU;sda = [(8 - s) * l + 1] * T;
846*4882a593Smuzhiyun * tI2C = 8 * (l + h) * T;
847*4882a593Smuzhiyun *
848*4882a593Smuzhiyun * tSU;sta = (8h * u + 1) * T;
849*4882a593Smuzhiyun * tHD;sta = [8h * (u + 1) - 1] * T;
850*4882a593Smuzhiyun * tSU;sto = (8h * p + 1) * T;
851*4882a593Smuzhiyun */
rk3x_i2c_v1_calc_timings(unsigned long clk_rate,struct i2c_timings * t,struct rk3x_i2c_calced_timings * t_calc)852*4882a593Smuzhiyun static int rk3x_i2c_v1_calc_timings(unsigned long clk_rate,
853*4882a593Smuzhiyun struct i2c_timings *t,
854*4882a593Smuzhiyun struct rk3x_i2c_calced_timings *t_calc)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun unsigned long min_low_ns, min_high_ns;
857*4882a593Smuzhiyun unsigned long min_setup_start_ns, min_setup_data_ns;
858*4882a593Smuzhiyun unsigned long min_setup_stop_ns, max_hold_data_ns;
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun unsigned long clk_rate_khz, scl_rate_khz;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun unsigned long min_low_div, min_high_div;
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun unsigned long min_div_for_hold, min_total_div;
865*4882a593Smuzhiyun unsigned long extra_div, extra_low_div;
866*4882a593Smuzhiyun unsigned long sda_update_cfg, stp_sta_cfg, stp_sto_cfg;
867*4882a593Smuzhiyun
868*4882a593Smuzhiyun const struct i2c_spec_values *spec;
869*4882a593Smuzhiyun int ret = 0;
870*4882a593Smuzhiyun
871*4882a593Smuzhiyun /* Support standard-mode, fast-mode and fast-mode plus */
872*4882a593Smuzhiyun if (WARN_ON(t->bus_freq_hz > I2C_MAX_FAST_MODE_PLUS_FREQ))
873*4882a593Smuzhiyun t->bus_freq_hz = I2C_MAX_FAST_MODE_PLUS_FREQ;
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun /* prevent scl_rate_khz from becoming 0 */
876*4882a593Smuzhiyun if (WARN_ON(t->bus_freq_hz < 1000))
877*4882a593Smuzhiyun t->bus_freq_hz = 1000;
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun /*
880*4882a593Smuzhiyun * min_low_ns: The minimum number of ns we need to hold low to
881*4882a593Smuzhiyun * meet I2C specification, should include fall time.
882*4882a593Smuzhiyun * min_high_ns: The minimum number of ns we need to hold high to
883*4882a593Smuzhiyun * meet I2C specification, should include rise time.
884*4882a593Smuzhiyun */
885*4882a593Smuzhiyun spec = rk3x_i2c_get_spec(t->bus_freq_hz);
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun /* calculate min-divh and min-divl */
888*4882a593Smuzhiyun clk_rate_khz = DIV_ROUND_UP(clk_rate, 1000);
889*4882a593Smuzhiyun scl_rate_khz = t->bus_freq_hz / 1000;
890*4882a593Smuzhiyun min_total_div = DIV_ROUND_UP(clk_rate_khz, scl_rate_khz * 8);
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun min_high_ns = t->scl_rise_ns + spec->min_high_ns;
893*4882a593Smuzhiyun min_high_div = DIV_ROUND_UP(clk_rate_khz * min_high_ns, 8 * 1000000);
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun min_low_ns = t->scl_fall_ns + spec->min_low_ns;
896*4882a593Smuzhiyun min_low_div = DIV_ROUND_UP(clk_rate_khz * min_low_ns, 8 * 1000000);
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun /*
899*4882a593Smuzhiyun * Final divh and divl must be greater than 0, otherwise the
900*4882a593Smuzhiyun * hardware would not output the i2c clk.
901*4882a593Smuzhiyun */
902*4882a593Smuzhiyun min_high_div = (min_high_div < 1) ? 2 : min_high_div;
903*4882a593Smuzhiyun min_low_div = (min_low_div < 1) ? 2 : min_low_div;
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun /* These are the min dividers needed for min hold times. */
906*4882a593Smuzhiyun min_div_for_hold = (min_low_div + min_high_div);
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun /*
909*4882a593Smuzhiyun * This is the maximum divider so we don't go over the maximum.
910*4882a593Smuzhiyun * We don't round up here (we round down) since this is a maximum.
911*4882a593Smuzhiyun */
912*4882a593Smuzhiyun if (min_div_for_hold >= min_total_div) {
913*4882a593Smuzhiyun /*
914*4882a593Smuzhiyun * Time needed to meet hold requirements is important.
915*4882a593Smuzhiyun * Just use that.
916*4882a593Smuzhiyun */
917*4882a593Smuzhiyun t_calc->div_low = min_low_div;
918*4882a593Smuzhiyun t_calc->div_high = min_high_div;
919*4882a593Smuzhiyun } else {
920*4882a593Smuzhiyun /*
921*4882a593Smuzhiyun * We've got to distribute some time among the low and high
922*4882a593Smuzhiyun * so we don't run too fast.
923*4882a593Smuzhiyun * We'll try to split things up by the scale of min_low_div and
924*4882a593Smuzhiyun * min_high_div, biasing slightly towards having a higher div
925*4882a593Smuzhiyun * for low (spend more time low).
926*4882a593Smuzhiyun */
927*4882a593Smuzhiyun extra_div = min_total_div - min_div_for_hold;
928*4882a593Smuzhiyun extra_low_div = DIV_ROUND_UP(min_low_div * extra_div,
929*4882a593Smuzhiyun min_div_for_hold);
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun t_calc->div_low = min_low_div + extra_low_div;
932*4882a593Smuzhiyun t_calc->div_high = min_high_div + (extra_div - extra_low_div);
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun
935*4882a593Smuzhiyun /*
936*4882a593Smuzhiyun * calculate sda data hold count by the rules, data_upd_st:3
937*4882a593Smuzhiyun * is a appropriate value to reduce calculated times.
938*4882a593Smuzhiyun */
939*4882a593Smuzhiyun for (sda_update_cfg = 3; sda_update_cfg > 0; sda_update_cfg--) {
940*4882a593Smuzhiyun max_hold_data_ns = DIV_ROUND_UP((sda_update_cfg
941*4882a593Smuzhiyun * (t_calc->div_low) + 1)
942*4882a593Smuzhiyun * 1000000, clk_rate_khz);
943*4882a593Smuzhiyun min_setup_data_ns = DIV_ROUND_UP(((8 - sda_update_cfg)
944*4882a593Smuzhiyun * (t_calc->div_low) + 1)
945*4882a593Smuzhiyun * 1000000, clk_rate_khz);
946*4882a593Smuzhiyun if ((max_hold_data_ns < spec->max_data_hold_ns) &&
947*4882a593Smuzhiyun (min_setup_data_ns > spec->min_data_setup_ns))
948*4882a593Smuzhiyun break;
949*4882a593Smuzhiyun }
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun /* calculate setup start config */
952*4882a593Smuzhiyun min_setup_start_ns = t->scl_rise_ns + spec->min_setup_start_ns;
953*4882a593Smuzhiyun stp_sta_cfg = DIV_ROUND_UP(clk_rate_khz * min_setup_start_ns
954*4882a593Smuzhiyun - 1000000, 8 * 1000000 * (t_calc->div_high));
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun /* calculate setup stop config */
957*4882a593Smuzhiyun min_setup_stop_ns = t->scl_rise_ns + spec->min_setup_stop_ns;
958*4882a593Smuzhiyun stp_sto_cfg = DIV_ROUND_UP(clk_rate_khz * min_setup_stop_ns
959*4882a593Smuzhiyun - 1000000, 8 * 1000000 * (t_calc->div_high));
960*4882a593Smuzhiyun
961*4882a593Smuzhiyun t_calc->tuning = REG_CON_SDA_CFG(--sda_update_cfg) |
962*4882a593Smuzhiyun REG_CON_STA_CFG(--stp_sta_cfg) |
963*4882a593Smuzhiyun REG_CON_STO_CFG(--stp_sto_cfg);
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun t_calc->div_low--;
966*4882a593Smuzhiyun t_calc->div_high--;
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun /* Maximum divider supported by hw is 0xffff */
969*4882a593Smuzhiyun if (t_calc->div_low > 0xffff) {
970*4882a593Smuzhiyun t_calc->div_low = 0xffff;
971*4882a593Smuzhiyun ret = -EINVAL;
972*4882a593Smuzhiyun }
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun if (t_calc->div_high > 0xffff) {
975*4882a593Smuzhiyun t_calc->div_high = 0xffff;
976*4882a593Smuzhiyun ret = -EINVAL;
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun return ret;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun
rk3x_i2c_adapt_div(struct rk3x_i2c * i2c,unsigned long clk_rate)982*4882a593Smuzhiyun static void rk3x_i2c_adapt_div(struct rk3x_i2c *i2c, unsigned long clk_rate)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun struct i2c_timings *t = &i2c->t;
985*4882a593Smuzhiyun struct rk3x_i2c_calced_timings calc;
986*4882a593Smuzhiyun u64 t_low_ns, t_high_ns;
987*4882a593Smuzhiyun unsigned long flags;
988*4882a593Smuzhiyun u32 val;
989*4882a593Smuzhiyun int ret;
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun ret = i2c->soc_data->calc_timings(clk_rate, t, &calc);
992*4882a593Smuzhiyun WARN_ONCE(ret != 0, "Could not reach SCL freq %u", t->bus_freq_hz);
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun clk_enable(i2c->pclk);
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun spin_lock_irqsave(&i2c->lock, flags);
997*4882a593Smuzhiyun val = i2c_readl(i2c, REG_CON);
998*4882a593Smuzhiyun val &= ~REG_CON_TUNING_MASK;
999*4882a593Smuzhiyun val |= calc.tuning;
1000*4882a593Smuzhiyun i2c_writel(i2c, val, REG_CON);
1001*4882a593Smuzhiyun i2c_writel(i2c, (calc.div_high << 16) | (calc.div_low & 0xffff),
1002*4882a593Smuzhiyun REG_CLKDIV);
1003*4882a593Smuzhiyun spin_unlock_irqrestore(&i2c->lock, flags);
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun clk_disable(i2c->pclk);
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun t_low_ns = div_u64(((u64)calc.div_low + 1) * 8 * 1000000000, clk_rate);
1008*4882a593Smuzhiyun t_high_ns = div_u64(((u64)calc.div_high + 1) * 8 * 1000000000,
1009*4882a593Smuzhiyun clk_rate);
1010*4882a593Smuzhiyun dev_dbg(i2c->dev,
1011*4882a593Smuzhiyun "CLK %lukhz, Req %uns, Act low %lluns high %lluns\n",
1012*4882a593Smuzhiyun clk_rate / 1000,
1013*4882a593Smuzhiyun 1000000000 / t->bus_freq_hz,
1014*4882a593Smuzhiyun t_low_ns, t_high_ns);
1015*4882a593Smuzhiyun }
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun /**
1018*4882a593Smuzhiyun * rk3x_i2c_clk_notifier_cb - Clock rate change callback
1019*4882a593Smuzhiyun * @nb: Pointer to notifier block
1020*4882a593Smuzhiyun * @event: Notification reason
1021*4882a593Smuzhiyun * @data: Pointer to notification data object
1022*4882a593Smuzhiyun *
1023*4882a593Smuzhiyun * The callback checks whether a valid bus frequency can be generated after the
1024*4882a593Smuzhiyun * change. If so, the change is acknowledged, otherwise the change is aborted.
1025*4882a593Smuzhiyun * New dividers are written to the HW in the pre- or post change notification
1026*4882a593Smuzhiyun * depending on the scaling direction.
1027*4882a593Smuzhiyun *
1028*4882a593Smuzhiyun * Code adapted from i2c-cadence.c.
1029*4882a593Smuzhiyun *
1030*4882a593Smuzhiyun * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK
1031*4882a593Smuzhiyun * to acknowledge the change, NOTIFY_DONE if the notification is
1032*4882a593Smuzhiyun * considered irrelevant.
1033*4882a593Smuzhiyun */
rk3x_i2c_clk_notifier_cb(struct notifier_block * nb,unsigned long event,void * data)1034*4882a593Smuzhiyun static int rk3x_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long
1035*4882a593Smuzhiyun event, void *data)
1036*4882a593Smuzhiyun {
1037*4882a593Smuzhiyun struct clk_notifier_data *ndata = data;
1038*4882a593Smuzhiyun struct rk3x_i2c *i2c = container_of(nb, struct rk3x_i2c, clk_rate_nb);
1039*4882a593Smuzhiyun struct rk3x_i2c_calced_timings calc;
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun switch (event) {
1042*4882a593Smuzhiyun case PRE_RATE_CHANGE:
1043*4882a593Smuzhiyun /*
1044*4882a593Smuzhiyun * Try the calculation (but don't store the result) ahead of
1045*4882a593Smuzhiyun * time to see if we need to block the clock change. Timings
1046*4882a593Smuzhiyun * shouldn't actually take effect until rk3x_i2c_adapt_div().
1047*4882a593Smuzhiyun */
1048*4882a593Smuzhiyun if (i2c->soc_data->calc_timings(ndata->new_rate, &i2c->t,
1049*4882a593Smuzhiyun &calc) != 0)
1050*4882a593Smuzhiyun return NOTIFY_STOP;
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun /* scale up */
1053*4882a593Smuzhiyun if (ndata->new_rate > ndata->old_rate)
1054*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, ndata->new_rate);
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun return NOTIFY_OK;
1057*4882a593Smuzhiyun case POST_RATE_CHANGE:
1058*4882a593Smuzhiyun /* scale down */
1059*4882a593Smuzhiyun if (ndata->new_rate < ndata->old_rate)
1060*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, ndata->new_rate);
1061*4882a593Smuzhiyun return NOTIFY_OK;
1062*4882a593Smuzhiyun case ABORT_RATE_CHANGE:
1063*4882a593Smuzhiyun /* scale up */
1064*4882a593Smuzhiyun if (ndata->new_rate > ndata->old_rate)
1065*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, ndata->old_rate);
1066*4882a593Smuzhiyun return NOTIFY_OK;
1067*4882a593Smuzhiyun default:
1068*4882a593Smuzhiyun return NOTIFY_DONE;
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun
1072*4882a593Smuzhiyun /**
1073*4882a593Smuzhiyun * Setup I2C registers for an I2C operation specified by msgs, num.
1074*4882a593Smuzhiyun *
1075*4882a593Smuzhiyun * Must be called with i2c->lock held.
1076*4882a593Smuzhiyun *
1077*4882a593Smuzhiyun * @msgs: I2C msgs to process
1078*4882a593Smuzhiyun * @num: Number of msgs
1079*4882a593Smuzhiyun *
1080*4882a593Smuzhiyun * returns: Number of I2C msgs processed or negative in case of error
1081*4882a593Smuzhiyun */
rk3x_i2c_setup(struct rk3x_i2c * i2c,struct i2c_msg * msgs,int num)1082*4882a593Smuzhiyun static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num)
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun u32 addr = (msgs[0].addr & 0x7f) << 1;
1085*4882a593Smuzhiyun int ret = 0;
1086*4882a593Smuzhiyun
1087*4882a593Smuzhiyun /*
1088*4882a593Smuzhiyun * The I2C adapter can issue a small (len < 4) write packet before
1089*4882a593Smuzhiyun * reading. This speeds up SMBus-style register reads.
1090*4882a593Smuzhiyun * The MRXADDR/MRXRADDR hold the slave address and the slave register
1091*4882a593Smuzhiyun * address in this case.
1092*4882a593Smuzhiyun */
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun if (num >= 2 && msgs[0].len < 4 &&
1095*4882a593Smuzhiyun !(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) {
1096*4882a593Smuzhiyun u32 reg_addr = 0;
1097*4882a593Smuzhiyun int i;
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun dev_dbg(i2c->dev, "Combined write/read from addr 0x%x\n",
1100*4882a593Smuzhiyun addr >> 1);
1101*4882a593Smuzhiyun
1102*4882a593Smuzhiyun /* Fill MRXRADDR with the register address(es) */
1103*4882a593Smuzhiyun for (i = 0; i < msgs[0].len; ++i) {
1104*4882a593Smuzhiyun reg_addr |= msgs[0].buf[i] << (i * 8);
1105*4882a593Smuzhiyun reg_addr |= REG_MRXADDR_VALID(i);
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun
1108*4882a593Smuzhiyun /* msgs[0] is handled by hw. */
1109*4882a593Smuzhiyun i2c->msg = &msgs[1];
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun i2c->mode = REG_CON_MOD_REGISTER_TX;
1112*4882a593Smuzhiyun
1113*4882a593Smuzhiyun i2c_writel(i2c, addr | REG_MRXADDR_VALID(0), REG_MRXADDR);
1114*4882a593Smuzhiyun i2c_writel(i2c, reg_addr, REG_MRXRADDR);
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun ret = 2;
1117*4882a593Smuzhiyun } else {
1118*4882a593Smuzhiyun /*
1119*4882a593Smuzhiyun * We'll have to do it the boring way and process the msgs
1120*4882a593Smuzhiyun * one-by-one.
1121*4882a593Smuzhiyun */
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun if (msgs[0].flags & I2C_M_RD) {
1124*4882a593Smuzhiyun addr |= 1; /* set read bit */
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun /*
1127*4882a593Smuzhiyun * We have to transmit the slave addr first. Use
1128*4882a593Smuzhiyun * MOD_REGISTER_TX for that purpose.
1129*4882a593Smuzhiyun */
1130*4882a593Smuzhiyun i2c->mode = REG_CON_MOD_REGISTER_TX;
1131*4882a593Smuzhiyun i2c_writel(i2c, addr | REG_MRXADDR_VALID(0),
1132*4882a593Smuzhiyun REG_MRXADDR);
1133*4882a593Smuzhiyun i2c_writel(i2c, 0, REG_MRXRADDR);
1134*4882a593Smuzhiyun } else {
1135*4882a593Smuzhiyun i2c->mode = REG_CON_MOD_TX;
1136*4882a593Smuzhiyun }
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun i2c->msg = &msgs[0];
1139*4882a593Smuzhiyun
1140*4882a593Smuzhiyun ret = 1;
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun i2c->addr = msgs[0].addr;
1144*4882a593Smuzhiyun i2c->busy = true;
1145*4882a593Smuzhiyun i2c->processed = 0;
1146*4882a593Smuzhiyun i2c->error = 0;
1147*4882a593Smuzhiyun
1148*4882a593Smuzhiyun rk3x_i2c_clean_ipd(i2c);
1149*4882a593Smuzhiyun if (i2c->autostop_supported)
1150*4882a593Smuzhiyun i2c_writel(i2c, 0, REG_CON1);
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun return ret;
1153*4882a593Smuzhiyun }
1154*4882a593Smuzhiyun
rk3x_i2c_wait_xfer_poll(struct rk3x_i2c * i2c,unsigned long xfer_time)1155*4882a593Smuzhiyun static int rk3x_i2c_wait_xfer_poll(struct rk3x_i2c *i2c, unsigned long xfer_time)
1156*4882a593Smuzhiyun {
1157*4882a593Smuzhiyun ktime_t timeout = ktime_add_ms(ktime_get(), xfer_time);
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun while (READ_ONCE(i2c->busy) &&
1160*4882a593Smuzhiyun ktime_compare(ktime_get(), timeout) < 0) {
1161*4882a593Smuzhiyun udelay(5);
1162*4882a593Smuzhiyun rk3x_i2c_irq(0, i2c);
1163*4882a593Smuzhiyun }
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun return !i2c->busy;
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun
rk3x_i2c_xfer_common(struct i2c_adapter * adap,struct i2c_msg * msgs,int num,bool polling)1168*4882a593Smuzhiyun static int rk3x_i2c_xfer_common(struct i2c_adapter *adap,
1169*4882a593Smuzhiyun struct i2c_msg *msgs, int num, bool polling)
1170*4882a593Smuzhiyun {
1171*4882a593Smuzhiyun struct rk3x_i2c *i2c = (struct rk3x_i2c *)adap->algo_data;
1172*4882a593Smuzhiyun unsigned long timeout, flags;
1173*4882a593Smuzhiyun u32 val;
1174*4882a593Smuzhiyun int ret = 0;
1175*4882a593Smuzhiyun int i;
1176*4882a593Smuzhiyun
1177*4882a593Smuzhiyun if (i2c->suspended)
1178*4882a593Smuzhiyun return -EACCES;
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun spin_lock_irqsave(&i2c->lock, flags);
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun clk_enable(i2c->clk);
1183*4882a593Smuzhiyun clk_enable(i2c->pclk);
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun i2c->is_last_msg = false;
1186*4882a593Smuzhiyun
1187*4882a593Smuzhiyun /*
1188*4882a593Smuzhiyun * Process msgs. We can handle more than one message at once (see
1189*4882a593Smuzhiyun * rk3x_i2c_setup()).
1190*4882a593Smuzhiyun */
1191*4882a593Smuzhiyun for (i = 0; i < num; i += ret) {
1192*4882a593Smuzhiyun unsigned long xfer_time = 100;
1193*4882a593Smuzhiyun int len;
1194*4882a593Smuzhiyun
1195*4882a593Smuzhiyun ret = rk3x_i2c_setup(i2c, msgs + i, num - i);
1196*4882a593Smuzhiyun if (ret < 0) {
1197*4882a593Smuzhiyun dev_err(i2c->dev, "rk3x_i2c_setup() failed\n");
1198*4882a593Smuzhiyun break;
1199*4882a593Smuzhiyun }
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun /*
1202*4882a593Smuzhiyun * Transfer time in mSec = Total bits / transfer rate + interval time
1203*4882a593Smuzhiyun * Total bits = 9 bits per byte (including ACK bit) + Start & stop bits
1204*4882a593Smuzhiyun */
1205*4882a593Smuzhiyun if (ret == 2)
1206*4882a593Smuzhiyun len = msgs[i + 1].len;
1207*4882a593Smuzhiyun else
1208*4882a593Smuzhiyun len = msgs[i].len;
1209*4882a593Smuzhiyun xfer_time += len / 64;
1210*4882a593Smuzhiyun xfer_time += DIV_ROUND_CLOSEST(((len * 9) + 2) * MSEC_PER_SEC,
1211*4882a593Smuzhiyun i2c->t.bus_freq_hz);
1212*4882a593Smuzhiyun
1213*4882a593Smuzhiyun if (i + ret >= num)
1214*4882a593Smuzhiyun i2c->is_last_msg = true;
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun rk3x_i2c_start(i2c);
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun spin_unlock_irqrestore(&i2c->lock, flags);
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun if (!polling) {
1221*4882a593Smuzhiyun timeout = wait_event_timeout(i2c->wait, !i2c->busy,
1222*4882a593Smuzhiyun msecs_to_jiffies(xfer_time));
1223*4882a593Smuzhiyun } else {
1224*4882a593Smuzhiyun timeout = rk3x_i2c_wait_xfer_poll(i2c, xfer_time);
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun spin_lock_irqsave(&i2c->lock, flags);
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun if (timeout == 0) {
1230*4882a593Smuzhiyun dev_err(i2c->dev, "timeout, ipd: 0x%02x, state: %d\n",
1231*4882a593Smuzhiyun i2c_readl(i2c, REG_IPD), i2c->state);
1232*4882a593Smuzhiyun
1233*4882a593Smuzhiyun /* Force a STOP condition without interrupt */
1234*4882a593Smuzhiyun rk3x_i2c_disable_irq(i2c);
1235*4882a593Smuzhiyun val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK;
1236*4882a593Smuzhiyun val |= REG_CON_EN | REG_CON_STOP;
1237*4882a593Smuzhiyun i2c_writel(i2c, val, REG_CON);
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun i2c->state = STATE_IDLE;
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun ret = -ETIMEDOUT;
1242*4882a593Smuzhiyun break;
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun if (i2c->error) {
1246*4882a593Smuzhiyun ret = i2c->error;
1247*4882a593Smuzhiyun break;
1248*4882a593Smuzhiyun }
1249*4882a593Smuzhiyun }
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun rk3x_i2c_disable_irq(i2c);
1252*4882a593Smuzhiyun rk3x_i2c_disable(i2c);
1253*4882a593Smuzhiyun
1254*4882a593Smuzhiyun clk_disable(i2c->pclk);
1255*4882a593Smuzhiyun clk_disable(i2c->clk);
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun spin_unlock_irqrestore(&i2c->lock, flags);
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun return ret < 0 ? ret : num;
1260*4882a593Smuzhiyun }
1261*4882a593Smuzhiyun
rk3x_i2c_xfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)1262*4882a593Smuzhiyun static int rk3x_i2c_xfer(struct i2c_adapter *adap,
1263*4882a593Smuzhiyun struct i2c_msg *msgs, int num)
1264*4882a593Smuzhiyun {
1265*4882a593Smuzhiyun return rk3x_i2c_xfer_common(adap, msgs, num, false);
1266*4882a593Smuzhiyun }
1267*4882a593Smuzhiyun
rk3x_i2c_xfer_polling(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)1268*4882a593Smuzhiyun static int rk3x_i2c_xfer_polling(struct i2c_adapter *adap,
1269*4882a593Smuzhiyun struct i2c_msg *msgs, int num)
1270*4882a593Smuzhiyun {
1271*4882a593Smuzhiyun return rk3x_i2c_xfer_common(adap, msgs, num, true);
1272*4882a593Smuzhiyun }
1273*4882a593Smuzhiyun
rk3x_i2c_restart_notify(struct notifier_block * this,unsigned long mode,void * cmd)1274*4882a593Smuzhiyun static int rk3x_i2c_restart_notify(struct notifier_block *this,
1275*4882a593Smuzhiyun unsigned long mode, void *cmd)
1276*4882a593Smuzhiyun {
1277*4882a593Smuzhiyun struct rk3x_i2c *i2c = container_of(this, struct rk3x_i2c,
1278*4882a593Smuzhiyun i2c_restart_nb);
1279*4882a593Smuzhiyun int tmo = WAIT_TIMEOUT * USEC_PER_MSEC;
1280*4882a593Smuzhiyun u32 val;
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun if (i2c->state != STATE_IDLE) {
1283*4882a593Smuzhiyun i2c->system_restarting = true;
1284*4882a593Smuzhiyun /* complete the unfinished job */
1285*4882a593Smuzhiyun while (tmo-- && i2c->busy) {
1286*4882a593Smuzhiyun udelay(1);
1287*4882a593Smuzhiyun rk3x_i2c_irq(0, i2c);
1288*4882a593Smuzhiyun }
1289*4882a593Smuzhiyun }
1290*4882a593Smuzhiyun
1291*4882a593Smuzhiyun if (tmo <= 0) {
1292*4882a593Smuzhiyun dev_err(i2c->dev, "restart timeout, ipd: 0x%02x, state: %d\n",
1293*4882a593Smuzhiyun i2c_readl(i2c, REG_IPD), i2c->state);
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun /* Force a STOP condition without interrupt */
1296*4882a593Smuzhiyun i2c_writel(i2c, 0, REG_IEN);
1297*4882a593Smuzhiyun val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK;
1298*4882a593Smuzhiyun val |= REG_CON_EN | REG_CON_STOP;
1299*4882a593Smuzhiyun i2c_writel(i2c, val, REG_CON);
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun udelay(10);
1302*4882a593Smuzhiyun i2c->state = STATE_IDLE;
1303*4882a593Smuzhiyun }
1304*4882a593Smuzhiyun
1305*4882a593Smuzhiyun return NOTIFY_DONE;
1306*4882a593Smuzhiyun }
1307*4882a593Smuzhiyun
rk3x_i2c_get_version(struct rk3x_i2c * i2c)1308*4882a593Smuzhiyun static unsigned int rk3x_i2c_get_version(struct rk3x_i2c *i2c)
1309*4882a593Smuzhiyun {
1310*4882a593Smuzhiyun unsigned int version;
1311*4882a593Smuzhiyun
1312*4882a593Smuzhiyun clk_enable(i2c->pclk);
1313*4882a593Smuzhiyun version = i2c_readl(i2c, REG_CON) & REG_CON_VERSION;
1314*4882a593Smuzhiyun clk_disable(i2c->pclk);
1315*4882a593Smuzhiyun version >>= REG_CON_VERSION_SHIFT;
1316*4882a593Smuzhiyun
1317*4882a593Smuzhiyun return version;
1318*4882a593Smuzhiyun }
1319*4882a593Smuzhiyun
rk3x_i2c_of_get_bus_id(struct device * dev,struct rk3x_i2c * priv)1320*4882a593Smuzhiyun static int rk3x_i2c_of_get_bus_id(struct device *dev, struct rk3x_i2c *priv)
1321*4882a593Smuzhiyun {
1322*4882a593Smuzhiyun int bus_id = -1;
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_OF) && dev->of_node)
1325*4882a593Smuzhiyun bus_id = of_alias_get_id(dev->of_node, "i2c");
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun return bus_id;
1328*4882a593Smuzhiyun }
1329*4882a593Smuzhiyun
1330*4882a593Smuzhiyun #ifdef CONFIG_ACPI
rk3x_i2c_acpi_get_bus_id(struct device * dev,struct rk3x_i2c * priv)1331*4882a593Smuzhiyun static int rk3x_i2c_acpi_get_bus_id(struct device *dev, struct rk3x_i2c *priv)
1332*4882a593Smuzhiyun {
1333*4882a593Smuzhiyun struct acpi_device *adev;
1334*4882a593Smuzhiyun unsigned long bus_id = -1;
1335*4882a593Smuzhiyun const char *uid;
1336*4882a593Smuzhiyun int ret;
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun adev = ACPI_COMPANION(dev);
1339*4882a593Smuzhiyun if (!adev)
1340*4882a593Smuzhiyun return -ENXIO;
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun uid = acpi_device_uid(adev);
1343*4882a593Smuzhiyun if (!uid || !(*uid)) {
1344*4882a593Smuzhiyun dev_err(dev, "Cannot retrieve UID\n");
1345*4882a593Smuzhiyun return -ENODEV;
1346*4882a593Smuzhiyun }
1347*4882a593Smuzhiyun
1348*4882a593Smuzhiyun ret = kstrtoul(uid, 0, &bus_id);
1349*4882a593Smuzhiyun
1350*4882a593Smuzhiyun return !ret ? bus_id : -ERANGE;
1351*4882a593Smuzhiyun }
1352*4882a593Smuzhiyun #else
rk3x_i2c_acpi_get_bus_id(struct device * dev,struct rk3x_i2c * priv)1353*4882a593Smuzhiyun static int rk3x_i2c_acpi_get_bus_id(struct device *dev, struct rk3x_i2c *priv)
1354*4882a593Smuzhiyun {
1355*4882a593Smuzhiyun return -ENOENT;
1356*4882a593Smuzhiyun }
1357*4882a593Smuzhiyun #endif /* CONFIG_ACPI */
1358*4882a593Smuzhiyun
rk3x_i2c_suspend_noirq(struct device * dev)1359*4882a593Smuzhiyun static __maybe_unused int rk3x_i2c_suspend_noirq(struct device *dev)
1360*4882a593Smuzhiyun {
1361*4882a593Smuzhiyun struct rk3x_i2c *i2c = dev_get_drvdata(dev);
1362*4882a593Smuzhiyun
1363*4882a593Smuzhiyun /*
1364*4882a593Smuzhiyun * Below code is needed only to ensure that there are no
1365*4882a593Smuzhiyun * activities on I2C bus. if at this moment any driver
1366*4882a593Smuzhiyun * is trying to use I2C bus - this may cause i2c timeout.
1367*4882a593Smuzhiyun *
1368*4882a593Smuzhiyun * So forbid access to I2C device using i2c->suspended flag.
1369*4882a593Smuzhiyun */
1370*4882a593Smuzhiyun i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
1371*4882a593Smuzhiyun i2c->suspended = 1;
1372*4882a593Smuzhiyun i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
1373*4882a593Smuzhiyun
1374*4882a593Smuzhiyun return 0;
1375*4882a593Smuzhiyun }
1376*4882a593Smuzhiyun
rk3x_i2c_resume_noirq(struct device * dev)1377*4882a593Smuzhiyun static __maybe_unused int rk3x_i2c_resume_noirq(struct device *dev)
1378*4882a593Smuzhiyun {
1379*4882a593Smuzhiyun struct rk3x_i2c *i2c = dev_get_drvdata(dev);
1380*4882a593Smuzhiyun
1381*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, clk_get_rate(i2c->clk));
1382*4882a593Smuzhiyun
1383*4882a593Smuzhiyun /* Allow access to I2C bus */
1384*4882a593Smuzhiyun i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
1385*4882a593Smuzhiyun i2c->suspended = 0;
1386*4882a593Smuzhiyun i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER);
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun return 0;
1389*4882a593Smuzhiyun }
1390*4882a593Smuzhiyun
rk3x_i2c_func(struct i2c_adapter * adap)1391*4882a593Smuzhiyun static u32 rk3x_i2c_func(struct i2c_adapter *adap)
1392*4882a593Smuzhiyun {
1393*4882a593Smuzhiyun return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;
1394*4882a593Smuzhiyun }
1395*4882a593Smuzhiyun
1396*4882a593Smuzhiyun static const struct i2c_algorithm rk3x_i2c_algorithm = {
1397*4882a593Smuzhiyun .master_xfer = rk3x_i2c_xfer,
1398*4882a593Smuzhiyun .master_xfer_atomic = rk3x_i2c_xfer_polling,
1399*4882a593Smuzhiyun .functionality = rk3x_i2c_func,
1400*4882a593Smuzhiyun };
1401*4882a593Smuzhiyun
1402*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rv1108_soc_data = {
1403*4882a593Smuzhiyun .grf_offset = 0x408,
1404*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v1_calc_timings,
1405*4882a593Smuzhiyun };
1406*4882a593Smuzhiyun
1407*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rv1126_soc_data = {
1408*4882a593Smuzhiyun .grf_offset = 0x118,
1409*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v1_calc_timings,
1410*4882a593Smuzhiyun };
1411*4882a593Smuzhiyun
1412*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rk3066_soc_data = {
1413*4882a593Smuzhiyun .grf_offset = 0x154,
1414*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v0_calc_timings,
1415*4882a593Smuzhiyun };
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rk3188_soc_data = {
1418*4882a593Smuzhiyun .grf_offset = 0x0a4,
1419*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v0_calc_timings,
1420*4882a593Smuzhiyun };
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rk3228_soc_data = {
1423*4882a593Smuzhiyun .grf_offset = -1,
1424*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v0_calc_timings,
1425*4882a593Smuzhiyun };
1426*4882a593Smuzhiyun
1427*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rk3288_soc_data = {
1428*4882a593Smuzhiyun .grf_offset = -1,
1429*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v0_calc_timings,
1430*4882a593Smuzhiyun };
1431*4882a593Smuzhiyun
1432*4882a593Smuzhiyun static const struct rk3x_i2c_soc_data rk3399_soc_data = {
1433*4882a593Smuzhiyun .grf_offset = -1,
1434*4882a593Smuzhiyun .calc_timings = rk3x_i2c_v1_calc_timings,
1435*4882a593Smuzhiyun };
1436*4882a593Smuzhiyun
1437*4882a593Smuzhiyun static const struct of_device_id rk3x_i2c_match[] = {
1438*4882a593Smuzhiyun {
1439*4882a593Smuzhiyun .compatible = "rockchip,rv1108-i2c",
1440*4882a593Smuzhiyun .data = &rv1108_soc_data
1441*4882a593Smuzhiyun },
1442*4882a593Smuzhiyun {
1443*4882a593Smuzhiyun .compatible = "rockchip,rv1126-i2c",
1444*4882a593Smuzhiyun .data = &rv1126_soc_data
1445*4882a593Smuzhiyun },
1446*4882a593Smuzhiyun {
1447*4882a593Smuzhiyun .compatible = "rockchip,rk3066-i2c",
1448*4882a593Smuzhiyun .data = &rk3066_soc_data
1449*4882a593Smuzhiyun },
1450*4882a593Smuzhiyun {
1451*4882a593Smuzhiyun .compatible = "rockchip,rk3188-i2c",
1452*4882a593Smuzhiyun .data = &rk3188_soc_data
1453*4882a593Smuzhiyun },
1454*4882a593Smuzhiyun {
1455*4882a593Smuzhiyun .compatible = "rockchip,rk3228-i2c",
1456*4882a593Smuzhiyun .data = &rk3228_soc_data
1457*4882a593Smuzhiyun },
1458*4882a593Smuzhiyun {
1459*4882a593Smuzhiyun .compatible = "rockchip,rk3288-i2c",
1460*4882a593Smuzhiyun .data = &rk3288_soc_data
1461*4882a593Smuzhiyun },
1462*4882a593Smuzhiyun {
1463*4882a593Smuzhiyun .compatible = "rockchip,rk3399-i2c",
1464*4882a593Smuzhiyun .data = &rk3399_soc_data
1465*4882a593Smuzhiyun },
1466*4882a593Smuzhiyun {},
1467*4882a593Smuzhiyun };
1468*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rk3x_i2c_match);
1469*4882a593Smuzhiyun
rk3x_i2c_tb_cb(void * data)1470*4882a593Smuzhiyun static void rk3x_i2c_tb_cb(void *data)
1471*4882a593Smuzhiyun {
1472*4882a593Smuzhiyun unsigned long clk_rate;
1473*4882a593Smuzhiyun int ret;
1474*4882a593Smuzhiyun struct rk3x_i2c *i2c = (struct rk3x_i2c *)data;
1475*4882a593Smuzhiyun
1476*4882a593Smuzhiyun if (i2c->clk) {
1477*4882a593Smuzhiyun i2c->clk_rate_nb.notifier_call = rk3x_i2c_clk_notifier_cb;
1478*4882a593Smuzhiyun ret = clk_notifier_register(i2c->clk, &i2c->clk_rate_nb);
1479*4882a593Smuzhiyun if (ret != 0) {
1480*4882a593Smuzhiyun dev_err(i2c->dev, "Unable to register clock notifier\n");
1481*4882a593Smuzhiyun clk_unprepare(i2c->pclk);
1482*4882a593Smuzhiyun clk_unprepare(i2c->clk);
1483*4882a593Smuzhiyun return;
1484*4882a593Smuzhiyun }
1485*4882a593Smuzhiyun }
1486*4882a593Smuzhiyun
1487*4882a593Smuzhiyun clk_rate = clk_get_rate(i2c->clk);
1488*4882a593Smuzhiyun if (!clk_rate)
1489*4882a593Smuzhiyun device_property_read_u32(i2c->dev, "i2c,clk-rate", (u32 *)&clk_rate);
1490*4882a593Smuzhiyun
1491*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, clk_rate);
1492*4882a593Smuzhiyun if (rk3x_i2c_get_version(i2c) >= RK_I2C_VERSION5)
1493*4882a593Smuzhiyun i2c->autostop_supported = true;
1494*4882a593Smuzhiyun enable_irq(i2c->irq);
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun
rk3x_i2c_probe(struct platform_device * pdev)1497*4882a593Smuzhiyun static int rk3x_i2c_probe(struct platform_device *pdev)
1498*4882a593Smuzhiyun {
1499*4882a593Smuzhiyun struct fwnode_handle *fw = dev_fwnode(&pdev->dev);
1500*4882a593Smuzhiyun struct device_node *np = pdev->dev.of_node;
1501*4882a593Smuzhiyun struct rk3x_i2c *i2c;
1502*4882a593Smuzhiyun int ret = 0;
1503*4882a593Smuzhiyun u32 value;
1504*4882a593Smuzhiyun int irq;
1505*4882a593Smuzhiyun unsigned long clk_rate;
1506*4882a593Smuzhiyun
1507*4882a593Smuzhiyun i2c = devm_kzalloc(&pdev->dev, sizeof(struct rk3x_i2c), GFP_KERNEL);
1508*4882a593Smuzhiyun if (!i2c)
1509*4882a593Smuzhiyun return -ENOMEM;
1510*4882a593Smuzhiyun
1511*4882a593Smuzhiyun i2c->soc_data = (struct rk3x_i2c_soc_data *)device_get_match_data(&pdev->dev);
1512*4882a593Smuzhiyun
1513*4882a593Smuzhiyun ret = rk3x_i2c_acpi_get_bus_id(&pdev->dev, i2c);
1514*4882a593Smuzhiyun if (ret < 0) {
1515*4882a593Smuzhiyun ret = rk3x_i2c_of_get_bus_id(&pdev->dev, i2c);
1516*4882a593Smuzhiyun if (ret < 0)
1517*4882a593Smuzhiyun return ret;
1518*4882a593Smuzhiyun }
1519*4882a593Smuzhiyun
1520*4882a593Smuzhiyun i2c->adap.nr = ret;
1521*4882a593Smuzhiyun
1522*4882a593Smuzhiyun /* use common interface to get I2C timing properties */
1523*4882a593Smuzhiyun i2c_parse_fw_timings(&pdev->dev, &i2c->t, true);
1524*4882a593Smuzhiyun
1525*4882a593Smuzhiyun strlcpy(i2c->adap.name, "rk3x-i2c", sizeof(i2c->adap.name));
1526*4882a593Smuzhiyun i2c->adap.owner = THIS_MODULE;
1527*4882a593Smuzhiyun i2c->adap.algo = &rk3x_i2c_algorithm;
1528*4882a593Smuzhiyun i2c->adap.retries = 3;
1529*4882a593Smuzhiyun i2c->adap.dev.of_node = pdev->dev.of_node;
1530*4882a593Smuzhiyun i2c->adap.algo_data = i2c;
1531*4882a593Smuzhiyun i2c->adap.dev.parent = &pdev->dev;
1532*4882a593Smuzhiyun i2c->adap.dev.fwnode = fw;
1533*4882a593Smuzhiyun
1534*4882a593Smuzhiyun i2c->dev = &pdev->dev;
1535*4882a593Smuzhiyun
1536*4882a593Smuzhiyun spin_lock_init(&i2c->lock);
1537*4882a593Smuzhiyun init_waitqueue_head(&i2c->wait);
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun i2c->i2c_restart_nb.notifier_call = rk3x_i2c_restart_notify;
1540*4882a593Smuzhiyun i2c->i2c_restart_nb.priority = 128;
1541*4882a593Smuzhiyun ret = register_pre_restart_handler(&i2c->i2c_restart_nb);
1542*4882a593Smuzhiyun if (ret) {
1543*4882a593Smuzhiyun dev_err(&pdev->dev, "failed to setup i2c restart handler.\n");
1544*4882a593Smuzhiyun return ret;
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun i2c->regs = devm_platform_ioremap_resource(pdev, 0);
1548*4882a593Smuzhiyun if (IS_ERR(i2c->regs))
1549*4882a593Smuzhiyun return PTR_ERR(i2c->regs);
1550*4882a593Smuzhiyun
1551*4882a593Smuzhiyun /*
1552*4882a593Smuzhiyun * Switch to new interface if the SoC also offers the old one.
1553*4882a593Smuzhiyun * The control bit is located in the GRF register space.
1554*4882a593Smuzhiyun */
1555*4882a593Smuzhiyun if (i2c->soc_data->grf_offset >= 0) {
1556*4882a593Smuzhiyun struct regmap *grf;
1557*4882a593Smuzhiyun
1558*4882a593Smuzhiyun grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
1559*4882a593Smuzhiyun if (!IS_ERR(grf)) {
1560*4882a593Smuzhiyun int bus_nr = i2c->adap.nr;
1561*4882a593Smuzhiyun
1562*4882a593Smuzhiyun if (i2c->soc_data == &rv1108_soc_data && bus_nr == 2)
1563*4882a593Smuzhiyun /* rv1108 i2c2 set grf offset-0x408, bit-10 */
1564*4882a593Smuzhiyun value = BIT(26) | BIT(10);
1565*4882a593Smuzhiyun else if (i2c->soc_data == &rv1126_soc_data &&
1566*4882a593Smuzhiyun bus_nr == 2)
1567*4882a593Smuzhiyun /* rv1126 i2c2 set pmugrf offset-0x118, bit-4 */
1568*4882a593Smuzhiyun value = BIT(20) | BIT(4);
1569*4882a593Smuzhiyun else
1570*4882a593Smuzhiyun /* rk3xxx 27+i: write mask, 11+i: value */
1571*4882a593Smuzhiyun value = BIT(27 + bus_nr) | BIT(11 + bus_nr);
1572*4882a593Smuzhiyun
1573*4882a593Smuzhiyun ret = regmap_write(grf, i2c->soc_data->grf_offset,
1574*4882a593Smuzhiyun value);
1575*4882a593Smuzhiyun if (ret != 0) {
1576*4882a593Smuzhiyun dev_err(i2c->dev, "Could not write to GRF: %d\n",
1577*4882a593Smuzhiyun ret);
1578*4882a593Smuzhiyun return ret;
1579*4882a593Smuzhiyun }
1580*4882a593Smuzhiyun }
1581*4882a593Smuzhiyun }
1582*4882a593Smuzhiyun
1583*4882a593Smuzhiyun /* IRQ setup */
1584*4882a593Smuzhiyun irq = platform_get_irq(pdev, 0);
1585*4882a593Smuzhiyun if (irq < 0)
1586*4882a593Smuzhiyun return irq;
1587*4882a593Smuzhiyun i2c->irq = irq;
1588*4882a593Smuzhiyun
1589*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT_SERVICE) &&
1590*4882a593Smuzhiyun device_property_read_bool(&pdev->dev, "rockchip,amp-shared")) {
1591*4882a593Smuzhiyun i2c->tb_cl.data = i2c;
1592*4882a593Smuzhiyun i2c->tb_cl.cb = rk3x_i2c_tb_cb;
1593*4882a593Smuzhiyun irq_set_status_flags(irq, IRQ_NOAUTOEN);
1594*4882a593Smuzhiyun }
1595*4882a593Smuzhiyun
1596*4882a593Smuzhiyun ret = devm_request_irq(&pdev->dev, irq, rk3x_i2c_irq,
1597*4882a593Smuzhiyun 0, dev_name(&pdev->dev), i2c);
1598*4882a593Smuzhiyun if (ret < 0) {
1599*4882a593Smuzhiyun dev_err(&pdev->dev, "cannot request IRQ\n");
1600*4882a593Smuzhiyun return ret;
1601*4882a593Smuzhiyun }
1602*4882a593Smuzhiyun
1603*4882a593Smuzhiyun platform_set_drvdata(pdev, i2c);
1604*4882a593Smuzhiyun
1605*4882a593Smuzhiyun if (!has_acpi_companion(&pdev->dev)) {
1606*4882a593Smuzhiyun if (i2c->soc_data->calc_timings == rk3x_i2c_v0_calc_timings) {
1607*4882a593Smuzhiyun /* Only one clock to use for bus clock and peripheral clock */
1608*4882a593Smuzhiyun i2c->clk = devm_clk_get(&pdev->dev, NULL);
1609*4882a593Smuzhiyun i2c->pclk = i2c->clk;
1610*4882a593Smuzhiyun } else {
1611*4882a593Smuzhiyun i2c->clk = devm_clk_get(&pdev->dev, "i2c");
1612*4882a593Smuzhiyun i2c->pclk = devm_clk_get(&pdev->dev, "pclk");
1613*4882a593Smuzhiyun }
1614*4882a593Smuzhiyun
1615*4882a593Smuzhiyun if (IS_ERR(i2c->clk))
1616*4882a593Smuzhiyun return dev_err_probe(&pdev->dev, PTR_ERR(i2c->clk),
1617*4882a593Smuzhiyun "Can't get bus clk\n");
1618*4882a593Smuzhiyun
1619*4882a593Smuzhiyun if (IS_ERR(i2c->pclk))
1620*4882a593Smuzhiyun return dev_err_probe(&pdev->dev, PTR_ERR(i2c->pclk),
1621*4882a593Smuzhiyun "Can't get periph clk\n");
1622*4882a593Smuzhiyun }
1623*4882a593Smuzhiyun
1624*4882a593Smuzhiyun ret = clk_prepare(i2c->clk);
1625*4882a593Smuzhiyun if (ret < 0) {
1626*4882a593Smuzhiyun dev_err(&pdev->dev, "Can't prepare bus clk: %d\n", ret);
1627*4882a593Smuzhiyun return ret;
1628*4882a593Smuzhiyun }
1629*4882a593Smuzhiyun ret = clk_prepare(i2c->pclk);
1630*4882a593Smuzhiyun if (ret < 0) {
1631*4882a593Smuzhiyun dev_err(&pdev->dev, "Can't prepare periph clock: %d\n", ret);
1632*4882a593Smuzhiyun goto err_clk;
1633*4882a593Smuzhiyun }
1634*4882a593Smuzhiyun
1635*4882a593Smuzhiyun if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT_SERVICE) && i2c->tb_cl.cb) {
1636*4882a593Smuzhiyun rk_tb_client_register_cb(&i2c->tb_cl);
1637*4882a593Smuzhiyun } else {
1638*4882a593Smuzhiyun if (i2c->clk) {
1639*4882a593Smuzhiyun i2c->clk_rate_nb.notifier_call = rk3x_i2c_clk_notifier_cb;
1640*4882a593Smuzhiyun ret = clk_notifier_register(i2c->clk, &i2c->clk_rate_nb);
1641*4882a593Smuzhiyun if (ret != 0) {
1642*4882a593Smuzhiyun dev_err(&pdev->dev, "Unable to register clock notifier\n");
1643*4882a593Smuzhiyun goto err_pclk;
1644*4882a593Smuzhiyun }
1645*4882a593Smuzhiyun }
1646*4882a593Smuzhiyun
1647*4882a593Smuzhiyun clk_rate = clk_get_rate(i2c->clk);
1648*4882a593Smuzhiyun if (!clk_rate)
1649*4882a593Smuzhiyun device_property_read_u32(&pdev->dev, "i2c,clk-rate", (u32 *)&clk_rate);
1650*4882a593Smuzhiyun
1651*4882a593Smuzhiyun rk3x_i2c_adapt_div(i2c, clk_rate);
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun if (rk3x_i2c_get_version(i2c) >= RK_I2C_VERSION5)
1654*4882a593Smuzhiyun i2c->autostop_supported = true;
1655*4882a593Smuzhiyun }
1656*4882a593Smuzhiyun
1657*4882a593Smuzhiyun ret = i2c_add_numbered_adapter(&i2c->adap);
1658*4882a593Smuzhiyun if (ret < 0)
1659*4882a593Smuzhiyun goto err_clk_notifier;
1660*4882a593Smuzhiyun
1661*4882a593Smuzhiyun return 0;
1662*4882a593Smuzhiyun
1663*4882a593Smuzhiyun err_clk_notifier:
1664*4882a593Smuzhiyun clk_notifier_unregister(i2c->clk, &i2c->clk_rate_nb);
1665*4882a593Smuzhiyun err_pclk:
1666*4882a593Smuzhiyun clk_unprepare(i2c->pclk);
1667*4882a593Smuzhiyun err_clk:
1668*4882a593Smuzhiyun clk_unprepare(i2c->clk);
1669*4882a593Smuzhiyun return ret;
1670*4882a593Smuzhiyun }
1671*4882a593Smuzhiyun
rk3x_i2c_remove(struct platform_device * pdev)1672*4882a593Smuzhiyun static int rk3x_i2c_remove(struct platform_device *pdev)
1673*4882a593Smuzhiyun {
1674*4882a593Smuzhiyun struct rk3x_i2c *i2c = platform_get_drvdata(pdev);
1675*4882a593Smuzhiyun
1676*4882a593Smuzhiyun i2c_del_adapter(&i2c->adap);
1677*4882a593Smuzhiyun
1678*4882a593Smuzhiyun clk_notifier_unregister(i2c->clk, &i2c->clk_rate_nb);
1679*4882a593Smuzhiyun unregister_pre_restart_handler(&i2c->i2c_restart_nb);
1680*4882a593Smuzhiyun clk_unprepare(i2c->pclk);
1681*4882a593Smuzhiyun clk_unprepare(i2c->clk);
1682*4882a593Smuzhiyun
1683*4882a593Smuzhiyun return 0;
1684*4882a593Smuzhiyun }
1685*4882a593Smuzhiyun
1686*4882a593Smuzhiyun static const struct dev_pm_ops rk3x_i2c_pm_ops = {
1687*4882a593Smuzhiyun SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rk3x_i2c_suspend_noirq,
1688*4882a593Smuzhiyun rk3x_i2c_resume_noirq)
1689*4882a593Smuzhiyun };
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun static struct platform_driver rk3x_i2c_driver = {
1692*4882a593Smuzhiyun .probe = rk3x_i2c_probe,
1693*4882a593Smuzhiyun .remove = rk3x_i2c_remove,
1694*4882a593Smuzhiyun .driver = {
1695*4882a593Smuzhiyun .name = "rk3x-i2c",
1696*4882a593Smuzhiyun .of_match_table = rk3x_i2c_match,
1697*4882a593Smuzhiyun .pm = &rk3x_i2c_pm_ops,
1698*4882a593Smuzhiyun },
1699*4882a593Smuzhiyun };
1700*4882a593Smuzhiyun
1701*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_THUNDER_BOOT
rk3x_i2c_driver_init(void)1702*4882a593Smuzhiyun static int __init rk3x_i2c_driver_init(void)
1703*4882a593Smuzhiyun {
1704*4882a593Smuzhiyun return platform_driver_register(&rk3x_i2c_driver);
1705*4882a593Smuzhiyun }
1706*4882a593Smuzhiyun #ifdef CONFIG_INITCALL_ASYNC
1707*4882a593Smuzhiyun subsys_initcall_sync(rk3x_i2c_driver_init);
1708*4882a593Smuzhiyun #else
1709*4882a593Smuzhiyun subsys_initcall(rk3x_i2c_driver_init);
1710*4882a593Smuzhiyun #endif
1711*4882a593Smuzhiyun
rk3x_i2c_driver_exit(void)1712*4882a593Smuzhiyun static void __exit rk3x_i2c_driver_exit(void)
1713*4882a593Smuzhiyun {
1714*4882a593Smuzhiyun platform_driver_unregister(&rk3x_i2c_driver);
1715*4882a593Smuzhiyun }
1716*4882a593Smuzhiyun module_exit(rk3x_i2c_driver_exit);
1717*4882a593Smuzhiyun #else
1718*4882a593Smuzhiyun module_platform_driver(rk3x_i2c_driver);
1719*4882a593Smuzhiyun #endif
1720*4882a593Smuzhiyun
1721*4882a593Smuzhiyun MODULE_DESCRIPTION("Rockchip RK3xxx I2C Bus driver");
1722*4882a593Smuzhiyun MODULE_AUTHOR("Max Schwarz <max.schwarz@online.de>");
1723*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1724