Lines Matching refs:idev

111 static void i2c_int_disable(struct axxia_i2c_dev *idev, u32 mask)  in i2c_int_disable()  argument
115 int_en = readl(idev->base + MST_INT_ENABLE); in i2c_int_disable()
116 writel(int_en & ~mask, idev->base + MST_INT_ENABLE); in i2c_int_disable()
119 static void i2c_int_enable(struct axxia_i2c_dev *idev, u32 mask) in i2c_int_enable() argument
123 int_en = readl(idev->base + MST_INT_ENABLE); in i2c_int_enable()
124 writel(int_en | mask, idev->base + MST_INT_ENABLE); in i2c_int_enable()
135 static int axxia_i2c_init(struct axxia_i2c_dev *idev) in axxia_i2c_init() argument
137 u32 divisor = clk_get_rate(idev->i2c_clk) / idev->bus_clk_rate; in axxia_i2c_init()
138 u32 clk_mhz = clk_get_rate(idev->i2c_clk) / 1000000; in axxia_i2c_init()
145 dev_dbg(idev->dev, "rate=%uHz per_clk=%uMHz -> ratio=1:%u\n", in axxia_i2c_init()
146 idev->bus_clk_rate, clk_mhz, divisor); in axxia_i2c_init()
149 writel(0x01, idev->base + SOFT_RESET); in axxia_i2c_init()
151 while (readl(idev->base + SOFT_RESET) & 1) { in axxia_i2c_init()
153 dev_warn(idev->dev, "Soft reset failed\n"); in axxia_i2c_init()
159 writel(0x1, idev->base + GLOBAL_CONTROL); in axxia_i2c_init()
161 if (idev->bus_clk_rate <= 100000) { in axxia_i2c_init()
174 writel(t_high, idev->base + SCL_HIGH_PERIOD); in axxia_i2c_init()
176 writel(t_low, idev->base + SCL_LOW_PERIOD); in axxia_i2c_init()
178 writel(t_setup, idev->base + SDA_SETUP_TIME); in axxia_i2c_init()
180 writel(ns_to_clk(300, clk_mhz), idev->base + SDA_HOLD_TIME); in axxia_i2c_init()
182 writel(ns_to_clk(50, clk_mhz), idev->base + SPIKE_FLTR_LEN); in axxia_i2c_init()
197 writel(prescale, idev->base + TIMER_CLOCK_DIV); in axxia_i2c_init()
199 writel(WT_EN | WT_VALUE(tmo_clk), idev->base + WAIT_TIMER_CONTROL); in axxia_i2c_init()
202 i2c_int_disable(idev, ~0); in axxia_i2c_init()
205 writel(0x01, idev->base + INTERRUPT_ENABLE); in axxia_i2c_init()
229 static int axxia_i2c_empty_rx_fifo(struct axxia_i2c_dev *idev) in axxia_i2c_empty_rx_fifo() argument
231 struct i2c_msg *msg = idev->msg; in axxia_i2c_empty_rx_fifo()
232 size_t rx_fifo_avail = readl(idev->base + MST_RX_FIFO); in axxia_i2c_empty_rx_fifo()
233 int bytes_to_transfer = min(rx_fifo_avail, msg->len - idev->msg_xfrd); in axxia_i2c_empty_rx_fifo()
236 int c = readl(idev->base + MST_DATA); in axxia_i2c_empty_rx_fifo()
238 if (idev->msg_xfrd == 0 && i2c_m_recv_len(msg)) { in axxia_i2c_empty_rx_fifo()
243 idev->msg_err = -EPROTO; in axxia_i2c_empty_rx_fifo()
244 i2c_int_disable(idev, ~0); in axxia_i2c_empty_rx_fifo()
245 complete(&idev->msg_complete); in axxia_i2c_empty_rx_fifo()
249 writel(msg->len, idev->base + MST_RX_XFER); in axxia_i2c_empty_rx_fifo()
251 msg->buf[idev->msg_xfrd++] = c; in axxia_i2c_empty_rx_fifo()
261 static int axxia_i2c_fill_tx_fifo(struct axxia_i2c_dev *idev) in axxia_i2c_fill_tx_fifo() argument
263 struct i2c_msg *msg = idev->msg; in axxia_i2c_fill_tx_fifo()
264 size_t tx_fifo_avail = FIFO_SIZE - readl(idev->base + MST_TX_FIFO); in axxia_i2c_fill_tx_fifo()
265 int bytes_to_transfer = min(tx_fifo_avail, msg->len - idev->msg_xfrd); in axxia_i2c_fill_tx_fifo()
266 int ret = msg->len - idev->msg_xfrd - bytes_to_transfer; in axxia_i2c_fill_tx_fifo()
269 writel(msg->buf[idev->msg_xfrd++], idev->base + MST_DATA); in axxia_i2c_fill_tx_fifo()
276 struct axxia_i2c_dev *idev = _dev; in axxia_i2c_isr() local
279 if (!(readl(idev->base + INTERRUPT_STATUS) & INT_MST)) in axxia_i2c_isr()
283 status = readl(idev->base + MST_INT_STATUS); in axxia_i2c_isr()
285 if (!idev->msg) { in axxia_i2c_isr()
286 dev_warn(idev->dev, "unexpected interrupt\n"); in axxia_i2c_isr()
291 if (i2c_m_rd(idev->msg) && (status & MST_STATUS_RFL)) in axxia_i2c_isr()
292 axxia_i2c_empty_rx_fifo(idev); in axxia_i2c_isr()
295 if (!i2c_m_rd(idev->msg) && (status & MST_STATUS_TFL)) { in axxia_i2c_isr()
296 if (axxia_i2c_fill_tx_fifo(idev) == 0) in axxia_i2c_isr()
297 i2c_int_disable(idev, MST_STATUS_TFL); in axxia_i2c_isr()
302 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
303 complete(&idev->msg_complete); in axxia_i2c_isr()
306 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
307 if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len) in axxia_i2c_isr()
308 axxia_i2c_empty_rx_fifo(idev); in axxia_i2c_isr()
309 complete(&idev->msg_complete); in axxia_i2c_isr()
312 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
314 idev->msg_err = -EAGAIN; in axxia_i2c_isr()
316 idev->msg_err = -ENXIO; in axxia_i2c_isr()
318 idev->msg_err = -EIO; in axxia_i2c_isr()
319 dev_dbg(idev->dev, "error %#x, addr=%#x rx=%u/%u tx=%u/%u\n", in axxia_i2c_isr()
321 idev->msg->addr, in axxia_i2c_isr()
322 readl(idev->base + MST_RX_BYTES_XFRD), in axxia_i2c_isr()
323 readl(idev->base + MST_RX_XFER), in axxia_i2c_isr()
324 readl(idev->base + MST_TX_BYTES_XFRD), in axxia_i2c_isr()
325 readl(idev->base + MST_TX_XFER)); in axxia_i2c_isr()
326 complete(&idev->msg_complete); in axxia_i2c_isr()
331 writel(INT_MST, idev->base + INTERRUPT_STATUS); in axxia_i2c_isr()
336 static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg) in axxia_i2c_xfer_msg() argument
343 idev->msg = msg; in axxia_i2c_xfer_msg()
344 idev->msg_xfrd = 0; in axxia_i2c_xfer_msg()
345 idev->msg_err = 0; in axxia_i2c_xfer_msg()
346 reinit_completion(&idev->msg_complete); in axxia_i2c_xfer_msg()
375 writel(rx_xfer, idev->base + MST_RX_XFER); in axxia_i2c_xfer_msg()
376 writel(tx_xfer, idev->base + MST_TX_XFER); in axxia_i2c_xfer_msg()
377 writel(addr_1, idev->base + MST_ADDR_1); in axxia_i2c_xfer_msg()
378 writel(addr_2, idev->base + MST_ADDR_2); in axxia_i2c_xfer_msg()
382 else if (axxia_i2c_fill_tx_fifo(idev) != 0) in axxia_i2c_xfer_msg()
386 writel(CMD_MANUAL, idev->base + MST_COMMAND); in axxia_i2c_xfer_msg()
388 i2c_int_enable(idev, int_mask); in axxia_i2c_xfer_msg()
390 time_left = wait_for_completion_timeout(&idev->msg_complete, in axxia_i2c_xfer_msg()
393 i2c_int_disable(idev, int_mask); in axxia_i2c_xfer_msg()
395 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) in axxia_i2c_xfer_msg()
396 dev_warn(idev->dev, "busy after xfer\n"); in axxia_i2c_xfer_msg()
399 idev->msg_err = -ETIMEDOUT; in axxia_i2c_xfer_msg()
401 if (idev->msg_err == -ETIMEDOUT) in axxia_i2c_xfer_msg()
402 i2c_recover_bus(&idev->adapter); in axxia_i2c_xfer_msg()
404 if (unlikely(idev->msg_err) && idev->msg_err != -ENXIO) in axxia_i2c_xfer_msg()
405 axxia_i2c_init(idev); in axxia_i2c_xfer_msg()
407 return idev->msg_err; in axxia_i2c_xfer_msg()
410 static int axxia_i2c_stop(struct axxia_i2c_dev *idev) in axxia_i2c_stop() argument
415 reinit_completion(&idev->msg_complete); in axxia_i2c_stop()
418 writel(0xb, idev->base + MST_COMMAND); in axxia_i2c_stop()
419 i2c_int_enable(idev, int_mask); in axxia_i2c_stop()
420 time_left = wait_for_completion_timeout(&idev->msg_complete, in axxia_i2c_stop()
422 i2c_int_disable(idev, int_mask); in axxia_i2c_stop()
426 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) in axxia_i2c_stop()
427 dev_warn(idev->dev, "busy after stop\n"); in axxia_i2c_stop()
435 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap); in axxia_i2c_xfer() local
440 ret = axxia_i2c_xfer_msg(idev, &msgs[i]); in axxia_i2c_xfer()
442 axxia_i2c_stop(idev); in axxia_i2c_xfer()
449 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap); in axxia_i2c_get_scl() local
451 return !!(readl(idev->base + I2C_BUS_MONITOR) & BM_SCLS); in axxia_i2c_get_scl()
456 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap); in axxia_i2c_set_scl() local
460 tmp = readl(idev->base + I2C_BUS_MONITOR) & BM_SDAC; in axxia_i2c_set_scl()
463 writel(tmp, idev->base + I2C_BUS_MONITOR); in axxia_i2c_set_scl()
468 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap); in axxia_i2c_get_sda() local
470 return !!(readl(idev->base + I2C_BUS_MONITOR) & BM_SDAS); in axxia_i2c_get_sda()
500 struct axxia_i2c_dev *idev = NULL; in axxia_i2c_probe() local
506 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL); in axxia_i2c_probe()
507 if (!idev) in axxia_i2c_probe()
521 idev->i2c_clk = devm_clk_get(&pdev->dev, "i2c"); in axxia_i2c_probe()
522 if (IS_ERR(idev->i2c_clk)) { in axxia_i2c_probe()
524 return PTR_ERR(idev->i2c_clk); in axxia_i2c_probe()
527 idev->base = base; in axxia_i2c_probe()
528 idev->dev = &pdev->dev; in axxia_i2c_probe()
529 init_completion(&idev->msg_complete); in axxia_i2c_probe()
531 of_property_read_u32(np, "clock-frequency", &idev->bus_clk_rate); in axxia_i2c_probe()
532 if (idev->bus_clk_rate == 0) in axxia_i2c_probe()
533 idev->bus_clk_rate = 100000; /* default clock rate */ in axxia_i2c_probe()
535 ret = axxia_i2c_init(idev); in axxia_i2c_probe()
542 pdev->name, idev); in axxia_i2c_probe()
548 clk_prepare_enable(idev->i2c_clk); in axxia_i2c_probe()
550 i2c_set_adapdata(&idev->adapter, idev); in axxia_i2c_probe()
551 strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name)); in axxia_i2c_probe()
552 idev->adapter.owner = THIS_MODULE; in axxia_i2c_probe()
553 idev->adapter.algo = &axxia_i2c_algo; in axxia_i2c_probe()
554 idev->adapter.bus_recovery_info = &axxia_i2c_recovery_info; in axxia_i2c_probe()
555 idev->adapter.quirks = &axxia_i2c_quirks; in axxia_i2c_probe()
556 idev->adapter.dev.parent = &pdev->dev; in axxia_i2c_probe()
557 idev->adapter.dev.of_node = pdev->dev.of_node; in axxia_i2c_probe()
559 platform_set_drvdata(pdev, idev); in axxia_i2c_probe()
561 ret = i2c_add_adapter(&idev->adapter); in axxia_i2c_probe()
572 struct axxia_i2c_dev *idev = platform_get_drvdata(pdev); in axxia_i2c_remove() local
574 clk_disable_unprepare(idev->i2c_clk); in axxia_i2c_remove()
575 i2c_del_adapter(&idev->adapter); in axxia_i2c_remove()