Lines Matching refs:idev
107 static void i2c_int_disable(struct axxia_i2c_dev *idev, u32 mask) in i2c_int_disable() argument
111 int_en = readl(idev->base + MST_INT_ENABLE); in i2c_int_disable()
112 writel(int_en & ~mask, idev->base + MST_INT_ENABLE); in i2c_int_disable()
115 static void i2c_int_enable(struct axxia_i2c_dev *idev, u32 mask) in i2c_int_enable() argument
119 int_en = readl(idev->base + MST_INT_ENABLE); in i2c_int_enable()
120 writel(int_en | mask, idev->base + MST_INT_ENABLE); in i2c_int_enable()
131 static int axxia_i2c_init(struct axxia_i2c_dev *idev) in axxia_i2c_init() argument
133 u32 divisor = clk_get_rate(idev->i2c_clk) / idev->bus_clk_rate; in axxia_i2c_init()
134 u32 clk_mhz = clk_get_rate(idev->i2c_clk) / 1000000; in axxia_i2c_init()
141 dev_dbg(idev->dev, "rate=%uHz per_clk=%uMHz -> ratio=1:%u\n", in axxia_i2c_init()
142 idev->bus_clk_rate, clk_mhz, divisor); in axxia_i2c_init()
145 writel(0x01, idev->base + SOFT_RESET); in axxia_i2c_init()
147 while (readl(idev->base + SOFT_RESET) & 1) { in axxia_i2c_init()
149 dev_warn(idev->dev, "Soft reset failed\n"); in axxia_i2c_init()
155 writel(0x1, idev->base + GLOBAL_CONTROL); in axxia_i2c_init()
157 if (idev->bus_clk_rate <= 100000) { in axxia_i2c_init()
170 writel(t_high, idev->base + SCL_HIGH_PERIOD); in axxia_i2c_init()
172 writel(t_low, idev->base + SCL_LOW_PERIOD); in axxia_i2c_init()
174 writel(t_setup, idev->base + SDA_SETUP_TIME); in axxia_i2c_init()
176 writel(ns_to_clk(300, clk_mhz), idev->base + SDA_HOLD_TIME); in axxia_i2c_init()
178 writel(ns_to_clk(50, clk_mhz), idev->base + SPIKE_FLTR_LEN); in axxia_i2c_init()
193 writel(prescale, idev->base + TIMER_CLOCK_DIV); in axxia_i2c_init()
195 writel(WT_EN | WT_VALUE(tmo_clk), idev->base + WAIT_TIMER_CONTROL); in axxia_i2c_init()
198 i2c_int_disable(idev, ~0); in axxia_i2c_init()
201 writel(0x01, idev->base + INTERRUPT_ENABLE); in axxia_i2c_init()
225 static int axxia_i2c_empty_rx_fifo(struct axxia_i2c_dev *idev) in axxia_i2c_empty_rx_fifo() argument
227 struct i2c_msg *msg = idev->msg; in axxia_i2c_empty_rx_fifo()
228 size_t rx_fifo_avail = readl(idev->base + MST_RX_FIFO); in axxia_i2c_empty_rx_fifo()
229 int bytes_to_transfer = min(rx_fifo_avail, msg->len - idev->msg_xfrd); in axxia_i2c_empty_rx_fifo()
232 int c = readl(idev->base + MST_DATA); in axxia_i2c_empty_rx_fifo()
234 if (idev->msg_xfrd == 0 && i2c_m_recv_len(msg)) { in axxia_i2c_empty_rx_fifo()
239 idev->msg_err = -EPROTO; in axxia_i2c_empty_rx_fifo()
240 i2c_int_disable(idev, ~0); in axxia_i2c_empty_rx_fifo()
241 complete(&idev->msg_complete); in axxia_i2c_empty_rx_fifo()
245 writel(msg->len, idev->base + MST_RX_XFER); in axxia_i2c_empty_rx_fifo()
247 msg->buf[idev->msg_xfrd++] = c; in axxia_i2c_empty_rx_fifo()
257 static int axxia_i2c_fill_tx_fifo(struct axxia_i2c_dev *idev) in axxia_i2c_fill_tx_fifo() argument
259 struct i2c_msg *msg = idev->msg; in axxia_i2c_fill_tx_fifo()
260 size_t tx_fifo_avail = FIFO_SIZE - readl(idev->base + MST_TX_FIFO); in axxia_i2c_fill_tx_fifo()
261 int bytes_to_transfer = min(tx_fifo_avail, msg->len - idev->msg_xfrd); in axxia_i2c_fill_tx_fifo()
262 int ret = msg->len - idev->msg_xfrd - bytes_to_transfer; in axxia_i2c_fill_tx_fifo()
265 writel(msg->buf[idev->msg_xfrd++], idev->base + MST_DATA); in axxia_i2c_fill_tx_fifo()
272 struct axxia_i2c_dev *idev = _dev; in axxia_i2c_isr() local
275 if (!(readl(idev->base + INTERRUPT_STATUS) & INT_MST)) in axxia_i2c_isr()
279 status = readl(idev->base + MST_INT_STATUS); in axxia_i2c_isr()
281 if (!idev->msg) { in axxia_i2c_isr()
282 dev_warn(idev->dev, "unexpected interrupt\n"); in axxia_i2c_isr()
287 if (i2c_m_rd(idev->msg) && (status & MST_STATUS_RFL)) in axxia_i2c_isr()
288 axxia_i2c_empty_rx_fifo(idev); in axxia_i2c_isr()
291 if (!i2c_m_rd(idev->msg) && (status & MST_STATUS_TFL)) { in axxia_i2c_isr()
292 if (axxia_i2c_fill_tx_fifo(idev) == 0) in axxia_i2c_isr()
293 i2c_int_disable(idev, MST_STATUS_TFL); in axxia_i2c_isr()
298 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
299 complete(&idev->msg_complete); in axxia_i2c_isr()
302 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
303 if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len) in axxia_i2c_isr()
304 axxia_i2c_empty_rx_fifo(idev); in axxia_i2c_isr()
305 complete(&idev->msg_complete); in axxia_i2c_isr()
308 i2c_int_disable(idev, ~0); in axxia_i2c_isr()
310 idev->msg_err = -EAGAIN; in axxia_i2c_isr()
312 idev->msg_err = -ENXIO; in axxia_i2c_isr()
314 idev->msg_err = -EIO; in axxia_i2c_isr()
315 dev_dbg(idev->dev, "error %#x, addr=%#x rx=%u/%u tx=%u/%u\n", in axxia_i2c_isr()
317 idev->msg->addr, in axxia_i2c_isr()
318 readl(idev->base + MST_RX_BYTES_XFRD), in axxia_i2c_isr()
319 readl(idev->base + MST_RX_XFER), in axxia_i2c_isr()
320 readl(idev->base + MST_TX_BYTES_XFRD), in axxia_i2c_isr()
321 readl(idev->base + MST_TX_XFER)); in axxia_i2c_isr()
322 complete(&idev->msg_complete); in axxia_i2c_isr()
327 writel(INT_MST, idev->base + INTERRUPT_STATUS); in axxia_i2c_isr()
332 static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg) in axxia_i2c_xfer_msg() argument
339 idev->msg = msg; in axxia_i2c_xfer_msg()
340 idev->msg_xfrd = 0; in axxia_i2c_xfer_msg()
341 idev->msg_err = 0; in axxia_i2c_xfer_msg()
342 reinit_completion(&idev->msg_complete); in axxia_i2c_xfer_msg()
371 writel(rx_xfer, idev->base + MST_RX_XFER); in axxia_i2c_xfer_msg()
372 writel(tx_xfer, idev->base + MST_TX_XFER); in axxia_i2c_xfer_msg()
373 writel(addr_1, idev->base + MST_ADDR_1); in axxia_i2c_xfer_msg()
374 writel(addr_2, idev->base + MST_ADDR_2); in axxia_i2c_xfer_msg()
378 else if (axxia_i2c_fill_tx_fifo(idev) != 0) in axxia_i2c_xfer_msg()
382 writel(CMD_MANUAL, idev->base + MST_COMMAND); in axxia_i2c_xfer_msg()
384 i2c_int_enable(idev, int_mask); in axxia_i2c_xfer_msg()
386 time_left = wait_for_completion_timeout(&idev->msg_complete, in axxia_i2c_xfer_msg()
389 i2c_int_disable(idev, int_mask); in axxia_i2c_xfer_msg()
391 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) in axxia_i2c_xfer_msg()
392 dev_warn(idev->dev, "busy after xfer\n"); in axxia_i2c_xfer_msg()
395 idev->msg_err = -ETIMEDOUT; in axxia_i2c_xfer_msg()
397 if (unlikely(idev->msg_err) && idev->msg_err != -ENXIO) in axxia_i2c_xfer_msg()
398 axxia_i2c_init(idev); in axxia_i2c_xfer_msg()
400 return idev->msg_err; in axxia_i2c_xfer_msg()
403 static int axxia_i2c_stop(struct axxia_i2c_dev *idev) in axxia_i2c_stop() argument
408 reinit_completion(&idev->msg_complete); in axxia_i2c_stop()
411 writel(0xb, idev->base + MST_COMMAND); in axxia_i2c_stop()
412 i2c_int_enable(idev, int_mask); in axxia_i2c_stop()
413 time_left = wait_for_completion_timeout(&idev->msg_complete, in axxia_i2c_stop()
415 i2c_int_disable(idev, int_mask); in axxia_i2c_stop()
419 if (readl(idev->base + MST_COMMAND) & CMD_BUSY) in axxia_i2c_stop()
420 dev_warn(idev->dev, "busy after stop\n"); in axxia_i2c_stop()
428 struct axxia_i2c_dev *idev = i2c_get_adapdata(adap); in axxia_i2c_xfer() local
433 ret = axxia_i2c_xfer_msg(idev, &msgs[i]); in axxia_i2c_xfer()
435 axxia_i2c_stop(idev); in axxia_i2c_xfer()
460 struct axxia_i2c_dev *idev = NULL; in axxia_i2c_probe() local
466 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL); in axxia_i2c_probe()
467 if (!idev) in axxia_i2c_probe()
481 idev->i2c_clk = devm_clk_get(&pdev->dev, "i2c"); in axxia_i2c_probe()
482 if (IS_ERR(idev->i2c_clk)) { in axxia_i2c_probe()
484 return PTR_ERR(idev->i2c_clk); in axxia_i2c_probe()
487 idev->base = base; in axxia_i2c_probe()
488 idev->dev = &pdev->dev; in axxia_i2c_probe()
489 init_completion(&idev->msg_complete); in axxia_i2c_probe()
491 of_property_read_u32(np, "clock-frequency", &idev->bus_clk_rate); in axxia_i2c_probe()
492 if (idev->bus_clk_rate == 0) in axxia_i2c_probe()
493 idev->bus_clk_rate = 100000; /* default clock rate */ in axxia_i2c_probe()
495 ret = axxia_i2c_init(idev); in axxia_i2c_probe()
502 pdev->name, idev); in axxia_i2c_probe()
508 clk_prepare_enable(idev->i2c_clk); in axxia_i2c_probe()
510 i2c_set_adapdata(&idev->adapter, idev); in axxia_i2c_probe()
511 strlcpy(idev->adapter.name, pdev->name, sizeof(idev->adapter.name)); in axxia_i2c_probe()
512 idev->adapter.owner = THIS_MODULE; in axxia_i2c_probe()
513 idev->adapter.algo = &axxia_i2c_algo; in axxia_i2c_probe()
514 idev->adapter.quirks = &axxia_i2c_quirks; in axxia_i2c_probe()
515 idev->adapter.dev.parent = &pdev->dev; in axxia_i2c_probe()
516 idev->adapter.dev.of_node = pdev->dev.of_node; in axxia_i2c_probe()
518 platform_set_drvdata(pdev, idev); in axxia_i2c_probe()
520 ret = i2c_add_adapter(&idev->adapter); in axxia_i2c_probe()
531 struct axxia_i2c_dev *idev = platform_get_drvdata(pdev); in axxia_i2c_remove() local
533 clk_disable_unprepare(idev->i2c_clk); in axxia_i2c_remove()
534 i2c_del_adapter(&idev->adapter); in axxia_i2c_remove()