Lines Matching full:i2c

3  * Driver for I2C adapter in Rockchip RK3xxx SoC
12 #include <linux/i2c.h>
92 /* Disable i2c all irqs */
183 * @grf_offset: offset inside the grf regmap for setting the i2c type
184 * @calc_timings: Callback function for i2c timing information calculated
194 * @adap: corresponding I2C adapter
200 * @clk_rate_nb: i2c clk rate change notify
201 * @t: I2C known timing information
202 * @lock: spinlock for the i2c bus
203 * @wait: the waitqueue to wait for i2c transfer
205 * @msg: current i2c message
206 * @addr: addr of i2c slave device
207 * @mode: mode of i2c transfer
209 * @state: state of i2c transfer
211 * @error: error code for i2c transfer
212 * @i2c_restart_nb: make sure the i2c transfer to be finished
242 /* I2C state machine */
254 static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c);
255 static int rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c, bool sended);
257 static inline void rk3x_i2c_wake_up(struct rk3x_i2c *i2c) in rk3x_i2c_wake_up() argument
259 if (!i2c->system_restarting) in rk3x_i2c_wake_up()
260 wake_up(&i2c->wait); in rk3x_i2c_wake_up()
263 static inline void i2c_writel(struct rk3x_i2c *i2c, u32 value, in i2c_writel() argument
266 writel(value, i2c->regs + offset); in i2c_writel()
269 static inline u32 i2c_readl(struct rk3x_i2c *i2c, unsigned int offset) in i2c_readl() argument
271 return readl(i2c->regs + offset); in i2c_readl()
275 static inline void rk3x_i2c_clean_ipd(struct rk3x_i2c *i2c) in rk3x_i2c_clean_ipd() argument
277 i2c_writel(i2c, REG_INT_ALL, REG_IPD); in rk3x_i2c_clean_ipd()
280 static inline void rk3x_i2c_disable_irq(struct rk3x_i2c *i2c) in rk3x_i2c_disable_irq() argument
282 i2c_writel(i2c, IEN_ALL_DISABLE, REG_IEN); in rk3x_i2c_disable_irq()
285 static inline void rk3x_i2c_disable(struct rk3x_i2c *i2c) in rk3x_i2c_disable() argument
287 u32 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK; in rk3x_i2c_disable()
289 i2c_writel(i2c, val, REG_CON); in rk3x_i2c_disable()
292 static bool rk3x_i2c_auto_stop(struct rk3x_i2c *i2c) in rk3x_i2c_auto_stop() argument
296 if (!i2c->autostop_supported) in rk3x_i2c_auto_stop()
299 if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) in rk3x_i2c_auto_stop()
302 if (!i2c->is_last_msg) in rk3x_i2c_auto_stop()
305 len = i2c->msg->len - i2c->processed; in rk3x_i2c_auto_stop()
310 i2c->state = STATE_STOP; in rk3x_i2c_auto_stop()
313 i2c_writel(i2c, con1, REG_CON1); in rk3x_i2c_auto_stop()
315 i2c_writel(i2c, REG_INT_STOP, REG_IEN); in rk3x_i2c_auto_stop()
317 i2c_writel(i2c, REG_INT_STOP | REG_INT_NAKRCV, REG_IEN); in rk3x_i2c_auto_stop()
322 i2c_writel(i2c, con1, REG_CON1); in rk3x_i2c_auto_stop()
329 static void rk3x_i2c_start(struct rk3x_i2c *i2c) in rk3x_i2c_start() argument
331 u32 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK; in rk3x_i2c_start()
332 bool auto_stop = rk3x_i2c_auto_stop(i2c); in rk3x_i2c_start()
336 if (i2c->mode == REG_CON_MOD_TX) { in rk3x_i2c_start()
338 i2c_writel(i2c, REG_INT_MBTF | REG_INT_NAKRCV, REG_IEN); in rk3x_i2c_start()
339 i2c->state = STATE_WRITE; in rk3x_i2c_start()
341 length = rk3x_i2c_fill_transmit_buf(i2c, false); in rk3x_i2c_start()
345 i2c_writel(i2c, REG_INT_MBRF | REG_INT_NAKRCV, REG_IEN); in rk3x_i2c_start()
346 i2c->state = STATE_READ; in rk3x_i2c_start()
351 val |= REG_CON_EN | REG_CON_MOD(i2c->mode) | REG_CON_START; in rk3x_i2c_start()
354 if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) in rk3x_i2c_start()
357 i2c_writel(i2c, val, REG_CON); in rk3x_i2c_start()
360 if (i2c->mode == REG_CON_MOD_TX) in rk3x_i2c_start()
361 i2c_writel(i2c, length, REG_MTXCNT); in rk3x_i2c_start()
363 rk3x_i2c_prepare_read(i2c); in rk3x_i2c_start()
371 static void rk3x_i2c_stop(struct rk3x_i2c *i2c, int error) in rk3x_i2c_stop() argument
375 i2c->processed = 0; in rk3x_i2c_stop()
376 i2c->msg = NULL; in rk3x_i2c_stop()
377 i2c->error = error; in rk3x_i2c_stop()
379 if (i2c->is_last_msg) { in rk3x_i2c_stop()
381 i2c_writel(i2c, REG_INT_STOP, REG_IEN); in rk3x_i2c_stop()
383 i2c->state = STATE_STOP; in rk3x_i2c_stop()
385 ctrl = i2c_readl(i2c, REG_CON); in rk3x_i2c_stop()
388 i2c_writel(i2c, ctrl, REG_CON); in rk3x_i2c_stop()
391 i2c->busy = false; in rk3x_i2c_stop()
392 i2c->state = STATE_IDLE; in rk3x_i2c_stop()
399 ctrl = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK; in rk3x_i2c_stop()
400 i2c_writel(i2c, ctrl, REG_CON); in rk3x_i2c_stop()
403 rk3x_i2c_wake_up(i2c); in rk3x_i2c_stop()
408 * Setup a read according to i2c->msg
410 static void rk3x_i2c_prepare_read(struct rk3x_i2c *i2c) in rk3x_i2c_prepare_read() argument
412 unsigned int len = i2c->msg->len - i2c->processed; in rk3x_i2c_prepare_read()
415 con = i2c_readl(i2c, REG_CON); in rk3x_i2c_prepare_read()
429 if (i2c->processed != 0) { in rk3x_i2c_prepare_read()
436 i2c_writel(i2c, con, REG_CON); in rk3x_i2c_prepare_read()
437 i2c_writel(i2c, len, REG_MRXCNT); in rk3x_i2c_prepare_read()
441 * Fill the transmit buffer with data from i2c->msg
443 static int rk3x_i2c_fill_transmit_buf(struct rk3x_i2c *i2c, bool sendend) in rk3x_i2c_fill_transmit_buf() argument
453 if ((i2c->processed == i2c->msg->len) && (cnt != 0)) in rk3x_i2c_fill_transmit_buf()
456 if (i2c->processed == 0 && cnt == 0) in rk3x_i2c_fill_transmit_buf()
457 byte = (i2c->addr & 0x7f) << 1; in rk3x_i2c_fill_transmit_buf()
459 byte = i2c->msg->buf[i2c->processed++]; in rk3x_i2c_fill_transmit_buf()
465 i2c_writel(i2c, val, TXBUFFER_BASE + 4 * i); in rk3x_i2c_fill_transmit_buf()
467 if (i2c->processed == i2c->msg->len) in rk3x_i2c_fill_transmit_buf()
472 i2c_writel(i2c, cnt, REG_MTXCNT); in rk3x_i2c_fill_transmit_buf()
480 static void rk3x_i2c_handle_write(struct rk3x_i2c *i2c, unsigned int ipd) in rk3x_i2c_handle_write() argument
483 rk3x_i2c_stop(i2c, -EIO); in rk3x_i2c_handle_write()
484 dev_warn_ratelimited(i2c->dev, "unexpected irq in WRITE: 0x%x\n", ipd); in rk3x_i2c_handle_write()
485 rk3x_i2c_clean_ipd(i2c); in rk3x_i2c_handle_write()
490 i2c_writel(i2c, REG_INT_MBTF, REG_IPD); in rk3x_i2c_handle_write()
492 rk3x_i2c_auto_stop(i2c); in rk3x_i2c_handle_write()
494 if (i2c->processed == i2c->msg->len) in rk3x_i2c_handle_write()
495 rk3x_i2c_stop(i2c, i2c->error); in rk3x_i2c_handle_write()
497 rk3x_i2c_fill_transmit_buf(i2c, true); in rk3x_i2c_handle_write()
500 static void rk3x_i2c_read(struct rk3x_i2c *i2c) in rk3x_i2c_read() argument
503 unsigned int len = i2c->msg->len - i2c->processed; in rk3x_i2c_read()
514 val = i2c_readl(i2c, RXBUFFER_BASE + (i / 4) * 4); in rk3x_i2c_read()
517 i2c->msg->buf[i2c->processed++] = byte; in rk3x_i2c_read()
521 static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd) in rk3x_i2c_handle_read() argument
528 i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD); in rk3x_i2c_handle_read()
531 rk3x_i2c_read(i2c); in rk3x_i2c_handle_read()
533 rk3x_i2c_auto_stop(i2c); in rk3x_i2c_handle_read()
535 if (i2c->processed == i2c->msg->len) in rk3x_i2c_handle_read()
536 rk3x_i2c_stop(i2c, i2c->error); in rk3x_i2c_handle_read()
538 rk3x_i2c_prepare_read(i2c); in rk3x_i2c_handle_read()
541 static void rk3x_i2c_handle_stop(struct rk3x_i2c *i2c, unsigned int ipd) in rk3x_i2c_handle_stop() argument
546 rk3x_i2c_stop(i2c, -EIO); in rk3x_i2c_handle_stop()
547 dev_warn_ratelimited(i2c->dev, "unexpected irq in STOP: 0x%x\n", ipd); in rk3x_i2c_handle_stop()
548 rk3x_i2c_clean_ipd(i2c); in rk3x_i2c_handle_stop()
552 if (i2c->autostop_supported && !i2c->error) { in rk3x_i2c_handle_stop()
553 if (i2c->mode != REG_CON_MOD_TX && i2c->msg) { in rk3x_i2c_handle_stop()
554 if ((i2c->msg->len - i2c->processed) > 0) in rk3x_i2c_handle_stop()
555 rk3x_i2c_read(i2c); in rk3x_i2c_handle_stop()
558 i2c->processed = 0; in rk3x_i2c_handle_stop()
559 i2c->msg = NULL; in rk3x_i2c_handle_stop()
563 i2c_writel(i2c, REG_INT_STOP, REG_IPD); in rk3x_i2c_handle_stop()
566 con = i2c_readl(i2c, REG_CON); in rk3x_i2c_handle_stop()
568 if (i2c->autostop_supported) in rk3x_i2c_handle_stop()
570 i2c_writel(i2c, con, REG_CON); in rk3x_i2c_handle_stop()
572 i2c->busy = false; in rk3x_i2c_handle_stop()
573 i2c->state = STATE_IDLE; in rk3x_i2c_handle_stop()
576 rk3x_i2c_wake_up(i2c); in rk3x_i2c_handle_stop()
581 struct rk3x_i2c *i2c = dev_id; in rk3x_i2c_irq() local
584 spin_lock(&i2c->lock); in rk3x_i2c_irq()
586 ipd = i2c_readl(i2c, REG_IPD); in rk3x_i2c_irq()
587 if (i2c->state == STATE_IDLE) { in rk3x_i2c_irq()
588 dev_warn_ratelimited(i2c->dev, in rk3x_i2c_irq()
591 rk3x_i2c_clean_ipd(i2c); in rk3x_i2c_irq()
595 dev_dbg(i2c->dev, "IRQ: state %d, ipd: %x\n", i2c->state, ipd); in rk3x_i2c_irq()
606 i2c_writel(i2c, REG_INT_NAKRCV, REG_IPD); in rk3x_i2c_irq()
610 if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) { in rk3x_i2c_irq()
611 if (i2c->autostop_supported) { in rk3x_i2c_irq()
612 i2c->error = -ENXIO; in rk3x_i2c_irq()
613 i2c->state = STATE_STOP; in rk3x_i2c_irq()
615 rk3x_i2c_stop(i2c, -ENXIO); in rk3x_i2c_irq()
625 switch (i2c->state) { in rk3x_i2c_irq()
627 rk3x_i2c_handle_write(i2c, ipd); in rk3x_i2c_irq()
630 rk3x_i2c_handle_read(i2c, ipd); in rk3x_i2c_irq()
633 rk3x_i2c_handle_stop(i2c, ipd); in rk3x_i2c_irq()
640 spin_unlock(&i2c->lock); in rk3x_i2c_irq()
645 * Get timing values of I2C specification
649 * Returns: Matched i2c spec values.
664 * @clk_rate: I2C input clock rate
665 * @t: Known I2C timing information
701 * meet I2C specification, should include fall time. in rk3x_i2c_v0_calc_timings()
703 * meet I2C specification, should include rise time. in rk3x_i2c_v0_calc_timings()
705 * I2C specification. in rk3x_i2c_v0_calc_timings()
708 * This is because the i2c host on Rockchip holds the data line in rk3x_i2c_v0_calc_timings()
825 * @clk_rate: I2C input clock rate
826 * @t: Known I2C timing information
881 * meet I2C specification, should include fall time. in rk3x_i2c_v1_calc_timings()
883 * meet I2C specification, should include rise time. in rk3x_i2c_v1_calc_timings()
900 * hardware would not output the i2c clk. in rk3x_i2c_v1_calc_timings()
982 static void rk3x_i2c_adapt_div(struct rk3x_i2c *i2c, unsigned long clk_rate) in rk3x_i2c_adapt_div() argument
984 struct i2c_timings *t = &i2c->t; in rk3x_i2c_adapt_div()
991 ret = i2c->soc_data->calc_timings(clk_rate, t, &calc); in rk3x_i2c_adapt_div()
994 clk_enable(i2c->pclk); in rk3x_i2c_adapt_div()
996 spin_lock_irqsave(&i2c->lock, flags); in rk3x_i2c_adapt_div()
997 val = i2c_readl(i2c, REG_CON); in rk3x_i2c_adapt_div()
1000 i2c_writel(i2c, val, REG_CON); in rk3x_i2c_adapt_div()
1001 i2c_writel(i2c, (calc.div_high << 16) | (calc.div_low & 0xffff), in rk3x_i2c_adapt_div()
1003 spin_unlock_irqrestore(&i2c->lock, flags); in rk3x_i2c_adapt_div()
1005 clk_disable(i2c->pclk); in rk3x_i2c_adapt_div()
1010 dev_dbg(i2c->dev, in rk3x_i2c_adapt_div()
1028 * Code adapted from i2c-cadence.c.
1038 struct rk3x_i2c *i2c = container_of(nb, struct rk3x_i2c, clk_rate_nb); in rk3x_i2c_clk_notifier_cb() local
1048 if (i2c->soc_data->calc_timings(ndata->new_rate, &i2c->t, in rk3x_i2c_clk_notifier_cb()
1054 rk3x_i2c_adapt_div(i2c, ndata->new_rate); in rk3x_i2c_clk_notifier_cb()
1060 rk3x_i2c_adapt_div(i2c, ndata->new_rate); in rk3x_i2c_clk_notifier_cb()
1065 rk3x_i2c_adapt_div(i2c, ndata->old_rate); in rk3x_i2c_clk_notifier_cb()
1073 * Setup I2C registers for an I2C operation specified by msgs, num.
1075 * Must be called with i2c->lock held.
1077 * @msgs: I2C msgs to process
1080 * returns: Number of I2C msgs processed or negative in case of error
1082 static int rk3x_i2c_setup(struct rk3x_i2c *i2c, struct i2c_msg *msgs, int num) in rk3x_i2c_setup() argument
1088 * The I2C adapter can issue a small (len < 4) write packet before in rk3x_i2c_setup()
1099 dev_dbg(i2c->dev, "Combined write/read from addr 0x%x\n", in rk3x_i2c_setup()
1109 i2c->msg = &msgs[1]; in rk3x_i2c_setup()
1111 i2c->mode = REG_CON_MOD_REGISTER_TX; in rk3x_i2c_setup()
1113 i2c_writel(i2c, addr | REG_MRXADDR_VALID(0), REG_MRXADDR); in rk3x_i2c_setup()
1114 i2c_writel(i2c, reg_addr, REG_MRXRADDR); in rk3x_i2c_setup()
1130 i2c->mode = REG_CON_MOD_REGISTER_TX; in rk3x_i2c_setup()
1131 i2c_writel(i2c, addr | REG_MRXADDR_VALID(0), in rk3x_i2c_setup()
1133 i2c_writel(i2c, 0, REG_MRXRADDR); in rk3x_i2c_setup()
1135 i2c->mode = REG_CON_MOD_TX; in rk3x_i2c_setup()
1138 i2c->msg = &msgs[0]; in rk3x_i2c_setup()
1143 i2c->addr = msgs[0].addr; in rk3x_i2c_setup()
1144 i2c->busy = true; in rk3x_i2c_setup()
1145 i2c->processed = 0; in rk3x_i2c_setup()
1146 i2c->error = 0; in rk3x_i2c_setup()
1148 rk3x_i2c_clean_ipd(i2c); in rk3x_i2c_setup()
1149 if (i2c->autostop_supported) in rk3x_i2c_setup()
1150 i2c_writel(i2c, 0, REG_CON1); in rk3x_i2c_setup()
1155 static int rk3x_i2c_wait_xfer_poll(struct rk3x_i2c *i2c, unsigned long xfer_time) in rk3x_i2c_wait_xfer_poll() argument
1159 while (READ_ONCE(i2c->busy) && in rk3x_i2c_wait_xfer_poll()
1162 rk3x_i2c_irq(0, i2c); in rk3x_i2c_wait_xfer_poll()
1165 return !i2c->busy; in rk3x_i2c_wait_xfer_poll()
1171 struct rk3x_i2c *i2c = (struct rk3x_i2c *)adap->algo_data; in rk3x_i2c_xfer_common() local
1177 if (i2c->suspended) in rk3x_i2c_xfer_common()
1180 spin_lock_irqsave(&i2c->lock, flags); in rk3x_i2c_xfer_common()
1182 clk_enable(i2c->clk); in rk3x_i2c_xfer_common()
1183 clk_enable(i2c->pclk); in rk3x_i2c_xfer_common()
1185 i2c->is_last_msg = false; in rk3x_i2c_xfer_common()
1195 ret = rk3x_i2c_setup(i2c, msgs + i, num - i); in rk3x_i2c_xfer_common()
1197 dev_err(i2c->dev, "rk3x_i2c_setup() failed\n"); in rk3x_i2c_xfer_common()
1211 i2c->t.bus_freq_hz); in rk3x_i2c_xfer_common()
1214 i2c->is_last_msg = true; in rk3x_i2c_xfer_common()
1216 rk3x_i2c_start(i2c); in rk3x_i2c_xfer_common()
1218 spin_unlock_irqrestore(&i2c->lock, flags); in rk3x_i2c_xfer_common()
1221 timeout = wait_event_timeout(i2c->wait, !i2c->busy, in rk3x_i2c_xfer_common()
1224 timeout = rk3x_i2c_wait_xfer_poll(i2c, xfer_time); in rk3x_i2c_xfer_common()
1227 spin_lock_irqsave(&i2c->lock, flags); in rk3x_i2c_xfer_common()
1230 dev_err(i2c->dev, "timeout, ipd: 0x%02x, state: %d\n", in rk3x_i2c_xfer_common()
1231 i2c_readl(i2c, REG_IPD), i2c->state); in rk3x_i2c_xfer_common()
1234 rk3x_i2c_disable_irq(i2c); in rk3x_i2c_xfer_common()
1235 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK; in rk3x_i2c_xfer_common()
1237 i2c_writel(i2c, val, REG_CON); in rk3x_i2c_xfer_common()
1239 i2c->state = STATE_IDLE; in rk3x_i2c_xfer_common()
1245 if (i2c->error) { in rk3x_i2c_xfer_common()
1246 ret = i2c->error; in rk3x_i2c_xfer_common()
1251 rk3x_i2c_disable_irq(i2c); in rk3x_i2c_xfer_common()
1252 rk3x_i2c_disable(i2c); in rk3x_i2c_xfer_common()
1254 clk_disable(i2c->pclk); in rk3x_i2c_xfer_common()
1255 clk_disable(i2c->clk); in rk3x_i2c_xfer_common()
1257 spin_unlock_irqrestore(&i2c->lock, flags); in rk3x_i2c_xfer_common()
1277 struct rk3x_i2c *i2c = container_of(this, struct rk3x_i2c, in rk3x_i2c_restart_notify() local
1282 if (i2c->state != STATE_IDLE) { in rk3x_i2c_restart_notify()
1283 i2c->system_restarting = true; in rk3x_i2c_restart_notify()
1285 while (tmo-- && i2c->busy) { in rk3x_i2c_restart_notify()
1287 rk3x_i2c_irq(0, i2c); in rk3x_i2c_restart_notify()
1292 dev_err(i2c->dev, "restart timeout, ipd: 0x%02x, state: %d\n", in rk3x_i2c_restart_notify()
1293 i2c_readl(i2c, REG_IPD), i2c->state); in rk3x_i2c_restart_notify()
1296 i2c_writel(i2c, 0, REG_IEN); in rk3x_i2c_restart_notify()
1297 val = i2c_readl(i2c, REG_CON) & REG_CON_TUNING_MASK; in rk3x_i2c_restart_notify()
1299 i2c_writel(i2c, val, REG_CON); in rk3x_i2c_restart_notify()
1302 i2c->state = STATE_IDLE; in rk3x_i2c_restart_notify()
1308 static unsigned int rk3x_i2c_get_version(struct rk3x_i2c *i2c) in rk3x_i2c_get_version() argument
1312 clk_enable(i2c->pclk); in rk3x_i2c_get_version()
1313 version = i2c_readl(i2c, REG_CON) & REG_CON_VERSION; in rk3x_i2c_get_version()
1314 clk_disable(i2c->pclk); in rk3x_i2c_get_version()
1325 bus_id = of_alias_get_id(dev->of_node, "i2c"); in rk3x_i2c_of_get_bus_id()
1361 struct rk3x_i2c *i2c = dev_get_drvdata(dev); in rk3x_i2c_suspend_noirq() local
1365 * activities on I2C bus. if at this moment any driver in rk3x_i2c_suspend_noirq()
1366 * is trying to use I2C bus - this may cause i2c timeout. in rk3x_i2c_suspend_noirq()
1368 * So forbid access to I2C device using i2c->suspended flag. in rk3x_i2c_suspend_noirq()
1370 i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER); in rk3x_i2c_suspend_noirq()
1371 i2c->suspended = 1; in rk3x_i2c_suspend_noirq()
1372 i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER); in rk3x_i2c_suspend_noirq()
1379 struct rk3x_i2c *i2c = dev_get_drvdata(dev); in rk3x_i2c_resume_noirq() local
1381 rk3x_i2c_adapt_div(i2c, clk_get_rate(i2c->clk)); in rk3x_i2c_resume_noirq()
1383 /* Allow access to I2C bus */ in rk3x_i2c_resume_noirq()
1384 i2c_lock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER); in rk3x_i2c_resume_noirq()
1385 i2c->suspended = 0; in rk3x_i2c_resume_noirq()
1386 i2c_unlock_bus(&i2c->adap, I2C_LOCK_ROOT_ADAPTER); in rk3x_i2c_resume_noirq()
1439 .compatible = "rockchip,rv1108-i2c",
1443 .compatible = "rockchip,rv1126-i2c",
1447 .compatible = "rockchip,rk3066-i2c",
1451 .compatible = "rockchip,rk3188-i2c",
1455 .compatible = "rockchip,rk3228-i2c",
1459 .compatible = "rockchip,rk3288-i2c",
1463 .compatible = "rockchip,rk3399-i2c",
1474 struct rk3x_i2c *i2c = (struct rk3x_i2c *)data; in rk3x_i2c_tb_cb() local
1476 if (i2c->clk) { in rk3x_i2c_tb_cb()
1477 i2c->clk_rate_nb.notifier_call = rk3x_i2c_clk_notifier_cb; in rk3x_i2c_tb_cb()
1478 ret = clk_notifier_register(i2c->clk, &i2c->clk_rate_nb); in rk3x_i2c_tb_cb()
1480 dev_err(i2c->dev, "Unable to register clock notifier\n"); in rk3x_i2c_tb_cb()
1481 clk_unprepare(i2c->pclk); in rk3x_i2c_tb_cb()
1482 clk_unprepare(i2c->clk); in rk3x_i2c_tb_cb()
1487 clk_rate = clk_get_rate(i2c->clk); in rk3x_i2c_tb_cb()
1489 device_property_read_u32(i2c->dev, "i2c,clk-rate", (u32 *)&clk_rate); in rk3x_i2c_tb_cb()
1491 rk3x_i2c_adapt_div(i2c, clk_rate); in rk3x_i2c_tb_cb()
1492 if (rk3x_i2c_get_version(i2c) >= RK_I2C_VERSION5) in rk3x_i2c_tb_cb()
1493 i2c->autostop_supported = true; in rk3x_i2c_tb_cb()
1494 enable_irq(i2c->irq); in rk3x_i2c_tb_cb()
1501 struct rk3x_i2c *i2c; in rk3x_i2c_probe() local
1507 i2c = devm_kzalloc(&pdev->dev, sizeof(struct rk3x_i2c), GFP_KERNEL); in rk3x_i2c_probe()
1508 if (!i2c) in rk3x_i2c_probe()
1511 i2c->soc_data = (struct rk3x_i2c_soc_data *)device_get_match_data(&pdev->dev); in rk3x_i2c_probe()
1513 ret = rk3x_i2c_acpi_get_bus_id(&pdev->dev, i2c); in rk3x_i2c_probe()
1515 ret = rk3x_i2c_of_get_bus_id(&pdev->dev, i2c); in rk3x_i2c_probe()
1520 i2c->adap.nr = ret; in rk3x_i2c_probe()
1522 /* use common interface to get I2C timing properties */ in rk3x_i2c_probe()
1523 i2c_parse_fw_timings(&pdev->dev, &i2c->t, true); in rk3x_i2c_probe()
1525 strlcpy(i2c->adap.name, "rk3x-i2c", sizeof(i2c->adap.name)); in rk3x_i2c_probe()
1526 i2c->adap.owner = THIS_MODULE; in rk3x_i2c_probe()
1527 i2c->adap.algo = &rk3x_i2c_algorithm; in rk3x_i2c_probe()
1528 i2c->adap.retries = 3; in rk3x_i2c_probe()
1529 i2c->adap.dev.of_node = pdev->dev.of_node; in rk3x_i2c_probe()
1530 i2c->adap.algo_data = i2c; in rk3x_i2c_probe()
1531 i2c->adap.dev.parent = &pdev->dev; in rk3x_i2c_probe()
1532 i2c->adap.dev.fwnode = fw; in rk3x_i2c_probe()
1534 i2c->dev = &pdev->dev; in rk3x_i2c_probe()
1536 spin_lock_init(&i2c->lock); in rk3x_i2c_probe()
1537 init_waitqueue_head(&i2c->wait); in rk3x_i2c_probe()
1539 i2c->i2c_restart_nb.notifier_call = rk3x_i2c_restart_notify; in rk3x_i2c_probe()
1540 i2c->i2c_restart_nb.priority = 128; in rk3x_i2c_probe()
1541 ret = register_pre_restart_handler(&i2c->i2c_restart_nb); in rk3x_i2c_probe()
1543 dev_err(&pdev->dev, "failed to setup i2c restart handler.\n"); in rk3x_i2c_probe()
1547 i2c->regs = devm_platform_ioremap_resource(pdev, 0); in rk3x_i2c_probe()
1548 if (IS_ERR(i2c->regs)) in rk3x_i2c_probe()
1549 return PTR_ERR(i2c->regs); in rk3x_i2c_probe()
1555 if (i2c->soc_data->grf_offset >= 0) { in rk3x_i2c_probe()
1560 int bus_nr = i2c->adap.nr; in rk3x_i2c_probe()
1562 if (i2c->soc_data == &rv1108_soc_data && bus_nr == 2) in rk3x_i2c_probe()
1565 else if (i2c->soc_data == &rv1126_soc_data && in rk3x_i2c_probe()
1573 ret = regmap_write(grf, i2c->soc_data->grf_offset, in rk3x_i2c_probe()
1576 dev_err(i2c->dev, "Could not write to GRF: %d\n", in rk3x_i2c_probe()
1587 i2c->irq = irq; in rk3x_i2c_probe()
1591 i2c->tb_cl.data = i2c; in rk3x_i2c_probe()
1592 i2c->tb_cl.cb = rk3x_i2c_tb_cb; in rk3x_i2c_probe()
1597 0, dev_name(&pdev->dev), i2c); in rk3x_i2c_probe()
1603 platform_set_drvdata(pdev, i2c); in rk3x_i2c_probe()
1606 if (i2c->soc_data->calc_timings == rk3x_i2c_v0_calc_timings) { in rk3x_i2c_probe()
1608 i2c->clk = devm_clk_get(&pdev->dev, NULL); in rk3x_i2c_probe()
1609 i2c->pclk = i2c->clk; in rk3x_i2c_probe()
1611 i2c->clk = devm_clk_get(&pdev->dev, "i2c"); in rk3x_i2c_probe()
1612 i2c->pclk = devm_clk_get(&pdev->dev, "pclk"); in rk3x_i2c_probe()
1615 if (IS_ERR(i2c->clk)) in rk3x_i2c_probe()
1616 return dev_err_probe(&pdev->dev, PTR_ERR(i2c->clk), in rk3x_i2c_probe()
1619 if (IS_ERR(i2c->pclk)) in rk3x_i2c_probe()
1620 return dev_err_probe(&pdev->dev, PTR_ERR(i2c->pclk), in rk3x_i2c_probe()
1624 ret = clk_prepare(i2c->clk); in rk3x_i2c_probe()
1629 ret = clk_prepare(i2c->pclk); in rk3x_i2c_probe()
1635 if (IS_ENABLED(CONFIG_ROCKCHIP_THUNDER_BOOT_SERVICE) && i2c->tb_cl.cb) { in rk3x_i2c_probe()
1636 rk_tb_client_register_cb(&i2c->tb_cl); in rk3x_i2c_probe()
1638 if (i2c->clk) { in rk3x_i2c_probe()
1639 i2c->clk_rate_nb.notifier_call = rk3x_i2c_clk_notifier_cb; in rk3x_i2c_probe()
1640 ret = clk_notifier_register(i2c->clk, &i2c->clk_rate_nb); in rk3x_i2c_probe()
1647 clk_rate = clk_get_rate(i2c->clk); in rk3x_i2c_probe()
1649 device_property_read_u32(&pdev->dev, "i2c,clk-rate", (u32 *)&clk_rate); in rk3x_i2c_probe()
1651 rk3x_i2c_adapt_div(i2c, clk_rate); in rk3x_i2c_probe()
1653 if (rk3x_i2c_get_version(i2c) >= RK_I2C_VERSION5) in rk3x_i2c_probe()
1654 i2c->autostop_supported = true; in rk3x_i2c_probe()
1657 ret = i2c_add_numbered_adapter(&i2c->adap); in rk3x_i2c_probe()
1664 clk_notifier_unregister(i2c->clk, &i2c->clk_rate_nb); in rk3x_i2c_probe()
1666 clk_unprepare(i2c->pclk); in rk3x_i2c_probe()
1668 clk_unprepare(i2c->clk); in rk3x_i2c_probe()
1674 struct rk3x_i2c *i2c = platform_get_drvdata(pdev); in rk3x_i2c_remove() local
1676 i2c_del_adapter(&i2c->adap); in rk3x_i2c_remove()
1678 clk_notifier_unregister(i2c->clk, &i2c->clk_rate_nb); in rk3x_i2c_remove()
1679 unregister_pre_restart_handler(&i2c->i2c_restart_nb); in rk3x_i2c_remove()
1680 clk_unprepare(i2c->pclk); in rk3x_i2c_remove()
1681 clk_unprepare(i2c->clk); in rk3x_i2c_remove()
1695 .name = "rk3x-i2c",
1721 MODULE_DESCRIPTION("Rockchip RK3xxx I2C Bus driver");