Lines Matching refs:i2c
205 static int mtk_i2c_clock_enable(struct mtk_i2c *i2c) in mtk_i2c_clock_enable() argument
209 ret = clk_prepare_enable(i2c->clk_dma); in mtk_i2c_clock_enable()
213 ret = clk_prepare_enable(i2c->clk_main); in mtk_i2c_clock_enable()
217 if (i2c->have_pmic) { in mtk_i2c_clock_enable()
218 ret = clk_prepare_enable(i2c->clk_pmic); in mtk_i2c_clock_enable()
225 clk_disable_unprepare(i2c->clk_main); in mtk_i2c_clock_enable()
227 clk_disable_unprepare(i2c->clk_dma); in mtk_i2c_clock_enable()
232 static void mtk_i2c_clock_disable(struct mtk_i2c *i2c) in mtk_i2c_clock_disable() argument
234 if (i2c->have_pmic) in mtk_i2c_clock_disable()
235 clk_disable_unprepare(i2c->clk_pmic); in mtk_i2c_clock_disable()
237 clk_disable_unprepare(i2c->clk_main); in mtk_i2c_clock_disable()
238 clk_disable_unprepare(i2c->clk_dma); in mtk_i2c_clock_disable()
241 static void mtk_i2c_init_hw(struct mtk_i2c *i2c) in mtk_i2c_init_hw() argument
245 writew(I2C_SOFT_RST, i2c->base + OFFSET_SOFTRESET); in mtk_i2c_init_hw()
248 if (i2c->use_push_pull) in mtk_i2c_init_hw()
249 writew(I2C_IO_CONFIG_PUSH_PULL, i2c->base + OFFSET_IO_CONFIG); in mtk_i2c_init_hw()
251 writew(I2C_IO_CONFIG_OPEN_DRAIN, i2c->base + OFFSET_IO_CONFIG); in mtk_i2c_init_hw()
253 if (i2c->dev_comp->dcm) in mtk_i2c_init_hw()
254 writew(I2C_DCM_DISABLE, i2c->base + OFFSET_DCM_EN); in mtk_i2c_init_hw()
256 writew(i2c->timing_reg, i2c->base + OFFSET_TIMING); in mtk_i2c_init_hw()
257 writew(i2c->high_speed_reg, i2c->base + OFFSET_HS); in mtk_i2c_init_hw()
260 if (i2c->have_pmic) in mtk_i2c_init_hw()
261 writew(I2C_CONTROL_WRAPPER, i2c->base + OFFSET_PATH_DIR); in mtk_i2c_init_hw()
265 writew(control_reg, i2c->base + OFFSET_CONTROL); in mtk_i2c_init_hw()
266 writew(I2C_DELAY_LEN, i2c->base + OFFSET_DELAY_LEN); in mtk_i2c_init_hw()
268 writel(I2C_DMA_HARD_RST, i2c->pdmabase + OFFSET_RST); in mtk_i2c_init_hw()
270 writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_RST); in mtk_i2c_init_hw()
284 static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk, in mtk_i2c_set_speed() argument
299 target_speed = i2c->speed_hz; in mtk_i2c_set_speed()
342 dev_dbg(i2c->dev, "Unsupported speed (%uhz)\n", target_speed); in mtk_i2c_set_speed()
351 i2c->timing_reg = I2C_FS_TIME_INIT_VALUE; in mtk_i2c_set_speed()
352 i2c->high_speed_reg = I2C_TIME_DEFAULT_VALUE | in mtk_i2c_set_speed()
355 i2c->timing_reg = (sample_cnt << 8) | (step_cnt << 0); in mtk_i2c_set_speed()
357 i2c->high_speed_reg = I2C_TIME_CLR_VALUE; in mtk_i2c_set_speed()
363 static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs, in mtk_i2c_do_transfer() argument
374 i2c->irq_stat = 0; in mtk_i2c_do_transfer()
376 if (i2c->dev_comp->auto_restart) in mtk_i2c_do_transfer()
379 reinit_completion(&i2c->msg_complete); in mtk_i2c_do_transfer()
381 control_reg = readw(i2c->base + OFFSET_CONTROL) & in mtk_i2c_do_transfer()
383 if ((i2c->speed_hz > 400000) || (left_num >= 1)) in mtk_i2c_do_transfer()
386 if (i2c->op == I2C_MASTER_WRRD) in mtk_i2c_do_transfer()
389 writew(control_reg, i2c->base + OFFSET_CONTROL); in mtk_i2c_do_transfer()
392 if (i2c->speed_hz <= 100000) in mtk_i2c_do_transfer()
393 writew(I2C_ST_START_CON, i2c->base + OFFSET_EXT_CONF); in mtk_i2c_do_transfer()
395 writew(I2C_FS_START_CON, i2c->base + OFFSET_EXT_CONF); in mtk_i2c_do_transfer()
398 if (i2c->op == I2C_MASTER_RD) in mtk_i2c_do_transfer()
401 writew(addr_reg, i2c->base + OFFSET_SLAVE_ADDR); in mtk_i2c_do_transfer()
405 I2C_TRANSAC_COMP, i2c->base + OFFSET_INTR_STAT); in mtk_i2c_do_transfer()
406 writew(I2C_FIFO_ADDR_CLR, i2c->base + OFFSET_FIFO_ADDR_CLR); in mtk_i2c_do_transfer()
410 I2C_TRANSAC_COMP, i2c->base + OFFSET_INTR_MASK); in mtk_i2c_do_transfer()
413 if (i2c->op == I2C_MASTER_WRRD) { in mtk_i2c_do_transfer()
415 i2c->base + OFFSET_TRANSFER_LEN); in mtk_i2c_do_transfer()
416 writew(I2C_WRRD_TRANAC_VALUE, i2c->base + OFFSET_TRANSAC_LEN); in mtk_i2c_do_transfer()
418 writew(msgs->len, i2c->base + OFFSET_TRANSFER_LEN); in mtk_i2c_do_transfer()
419 writew(num, i2c->base + OFFSET_TRANSAC_LEN); in mtk_i2c_do_transfer()
423 if (i2c->op == I2C_MASTER_RD) { in mtk_i2c_do_transfer()
424 writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); in mtk_i2c_do_transfer()
425 writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON); in mtk_i2c_do_transfer()
426 rpaddr = dma_map_single(i2c->dev, msgs->buf, in mtk_i2c_do_transfer()
428 if (dma_mapping_error(i2c->dev, rpaddr)) in mtk_i2c_do_transfer()
430 writel((u32)rpaddr, i2c->pdmabase + OFFSET_RX_MEM_ADDR); in mtk_i2c_do_transfer()
431 writel(msgs->len, i2c->pdmabase + OFFSET_RX_LEN); in mtk_i2c_do_transfer()
432 } else if (i2c->op == I2C_MASTER_WR) { in mtk_i2c_do_transfer()
433 writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG); in mtk_i2c_do_transfer()
434 writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON); in mtk_i2c_do_transfer()
435 wpaddr = dma_map_single(i2c->dev, msgs->buf, in mtk_i2c_do_transfer()
437 if (dma_mapping_error(i2c->dev, wpaddr)) in mtk_i2c_do_transfer()
439 writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); in mtk_i2c_do_transfer()
440 writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); in mtk_i2c_do_transfer()
442 writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG); in mtk_i2c_do_transfer()
443 writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON); in mtk_i2c_do_transfer()
444 wpaddr = dma_map_single(i2c->dev, msgs->buf, in mtk_i2c_do_transfer()
446 if (dma_mapping_error(i2c->dev, wpaddr)) in mtk_i2c_do_transfer()
448 rpaddr = dma_map_single(i2c->dev, (msgs + 1)->buf, in mtk_i2c_do_transfer()
451 if (dma_mapping_error(i2c->dev, rpaddr)) { in mtk_i2c_do_transfer()
452 dma_unmap_single(i2c->dev, wpaddr, in mtk_i2c_do_transfer()
456 writel((u32)wpaddr, i2c->pdmabase + OFFSET_TX_MEM_ADDR); in mtk_i2c_do_transfer()
457 writel((u32)rpaddr, i2c->pdmabase + OFFSET_RX_MEM_ADDR); in mtk_i2c_do_transfer()
458 writel(msgs->len, i2c->pdmabase + OFFSET_TX_LEN); in mtk_i2c_do_transfer()
459 writel((msgs + 1)->len, i2c->pdmabase + OFFSET_RX_LEN); in mtk_i2c_do_transfer()
462 writel(I2C_DMA_START_EN, i2c->pdmabase + OFFSET_EN); in mtk_i2c_do_transfer()
464 if (!i2c->dev_comp->auto_restart) { in mtk_i2c_do_transfer()
471 writew(start_reg, i2c->base + OFFSET_START); in mtk_i2c_do_transfer()
473 ret = wait_for_completion_timeout(&i2c->msg_complete, in mtk_i2c_do_transfer()
474 i2c->adap.timeout); in mtk_i2c_do_transfer()
478 I2C_TRANSAC_COMP), i2c->base + OFFSET_INTR_MASK); in mtk_i2c_do_transfer()
480 if (i2c->op == I2C_MASTER_WR) { in mtk_i2c_do_transfer()
481 dma_unmap_single(i2c->dev, wpaddr, in mtk_i2c_do_transfer()
483 } else if (i2c->op == I2C_MASTER_RD) { in mtk_i2c_do_transfer()
484 dma_unmap_single(i2c->dev, rpaddr, in mtk_i2c_do_transfer()
487 dma_unmap_single(i2c->dev, wpaddr, msgs->len, in mtk_i2c_do_transfer()
489 dma_unmap_single(i2c->dev, rpaddr, (msgs + 1)->len, in mtk_i2c_do_transfer()
494 dev_dbg(i2c->dev, "addr: %x, transfer timeout\n", msgs->addr); in mtk_i2c_do_transfer()
495 mtk_i2c_init_hw(i2c); in mtk_i2c_do_transfer()
499 completion_done(&i2c->msg_complete); in mtk_i2c_do_transfer()
501 if (i2c->irq_stat & (I2C_HS_NACKERR | I2C_ACKERR)) { in mtk_i2c_do_transfer()
502 dev_dbg(i2c->dev, "addr: %x, transfer ACK error\n", msgs->addr); in mtk_i2c_do_transfer()
503 mtk_i2c_init_hw(i2c); in mtk_i2c_do_transfer()
515 struct mtk_i2c *i2c = i2c_get_adapdata(adap); in mtk_i2c_transfer() local
517 ret = mtk_i2c_clock_enable(i2c); in mtk_i2c_transfer()
523 dev_dbg(i2c->dev, "data buffer is NULL.\n"); in mtk_i2c_transfer()
529 i2c->op = I2C_MASTER_RD; in mtk_i2c_transfer()
531 i2c->op = I2C_MASTER_WR; in mtk_i2c_transfer()
533 if (!i2c->dev_comp->auto_restart) { in mtk_i2c_transfer()
536 i2c->op = I2C_MASTER_WRRD; in mtk_i2c_transfer()
542 ret = mtk_i2c_do_transfer(i2c, msgs, num, left_num); in mtk_i2c_transfer()
552 mtk_i2c_clock_disable(i2c); in mtk_i2c_transfer()
558 struct mtk_i2c *i2c = dev_id; in mtk_i2c_irq() local
562 if (i2c->dev_comp->auto_restart) in mtk_i2c_irq()
565 intr_stat = readw(i2c->base + OFFSET_INTR_STAT); in mtk_i2c_irq()
566 writew(intr_stat, i2c->base + OFFSET_INTR_STAT); in mtk_i2c_irq()
573 i2c->irq_stat |= intr_stat; in mtk_i2c_irq()
574 if (i2c->irq_stat & (I2C_TRANSAC_COMP | restart_flag)) in mtk_i2c_irq()
575 complete(&i2c->msg_complete); in mtk_i2c_irq()
590 static int mtk_i2c_parse_dt(struct device_node *np, struct mtk_i2c *i2c, in mtk_i2c_parse_dt() argument
595 ret = of_property_read_u32(np, "clock-frequency", &i2c->speed_hz); in mtk_i2c_parse_dt()
597 i2c->speed_hz = I2C_DEFAULT_SPEED; in mtk_i2c_parse_dt()
606 i2c->have_pmic = of_property_read_bool(np, "mediatek,have-pmic"); in mtk_i2c_parse_dt()
607 i2c->use_push_pull = in mtk_i2c_parse_dt()
617 struct mtk_i2c *i2c; in mtk_i2c_probe() local
623 i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); in mtk_i2c_probe()
624 if (!i2c) in mtk_i2c_probe()
627 ret = mtk_i2c_parse_dt(pdev->dev.of_node, i2c, &clk_src_div); in mtk_i2c_probe()
632 i2c->base = devm_ioremap_resource(&pdev->dev, res); in mtk_i2c_probe()
633 if (IS_ERR(i2c->base)) in mtk_i2c_probe()
634 return PTR_ERR(i2c->base); in mtk_i2c_probe()
637 i2c->pdmabase = devm_ioremap_resource(&pdev->dev, res); in mtk_i2c_probe()
638 if (IS_ERR(i2c->pdmabase)) in mtk_i2c_probe()
639 return PTR_ERR(i2c->pdmabase); in mtk_i2c_probe()
645 init_completion(&i2c->msg_complete); in mtk_i2c_probe()
651 i2c->dev_comp = of_id->data; in mtk_i2c_probe()
652 i2c->adap.dev.of_node = pdev->dev.of_node; in mtk_i2c_probe()
653 i2c->dev = &pdev->dev; in mtk_i2c_probe()
654 i2c->adap.dev.parent = &pdev->dev; in mtk_i2c_probe()
655 i2c->adap.owner = THIS_MODULE; in mtk_i2c_probe()
656 i2c->adap.algo = &mtk_i2c_algorithm; in mtk_i2c_probe()
657 i2c->adap.quirks = i2c->dev_comp->quirks; in mtk_i2c_probe()
658 i2c->adap.timeout = 2 * HZ; in mtk_i2c_probe()
659 i2c->adap.retries = 1; in mtk_i2c_probe()
661 if (i2c->have_pmic && !i2c->dev_comp->pmic_i2c) in mtk_i2c_probe()
664 i2c->clk_main = devm_clk_get(&pdev->dev, "main"); in mtk_i2c_probe()
665 if (IS_ERR(i2c->clk_main)) { in mtk_i2c_probe()
667 return PTR_ERR(i2c->clk_main); in mtk_i2c_probe()
670 i2c->clk_dma = devm_clk_get(&pdev->dev, "dma"); in mtk_i2c_probe()
671 if (IS_ERR(i2c->clk_dma)) { in mtk_i2c_probe()
673 return PTR_ERR(i2c->clk_dma); in mtk_i2c_probe()
676 clk = i2c->clk_main; in mtk_i2c_probe()
677 if (i2c->have_pmic) { in mtk_i2c_probe()
678 i2c->clk_pmic = devm_clk_get(&pdev->dev, "pmic"); in mtk_i2c_probe()
679 if (IS_ERR(i2c->clk_pmic)) { in mtk_i2c_probe()
681 return PTR_ERR(i2c->clk_pmic); in mtk_i2c_probe()
683 clk = i2c->clk_pmic; in mtk_i2c_probe()
686 strlcpy(i2c->adap.name, I2C_DRV_NAME, sizeof(i2c->adap.name)); in mtk_i2c_probe()
688 ret = mtk_i2c_set_speed(i2c, clk_get_rate(clk), clk_src_div); in mtk_i2c_probe()
694 ret = mtk_i2c_clock_enable(i2c); in mtk_i2c_probe()
699 mtk_i2c_init_hw(i2c); in mtk_i2c_probe()
700 mtk_i2c_clock_disable(i2c); in mtk_i2c_probe()
703 IRQF_TRIGGER_NONE, I2C_DRV_NAME, i2c); in mtk_i2c_probe()
710 i2c_set_adapdata(&i2c->adap, i2c); in mtk_i2c_probe()
711 ret = i2c_add_adapter(&i2c->adap); in mtk_i2c_probe()
717 platform_set_drvdata(pdev, i2c); in mtk_i2c_probe()
724 struct mtk_i2c *i2c = platform_get_drvdata(pdev); in mtk_i2c_remove() local
726 i2c_del_adapter(&i2c->adap); in mtk_i2c_remove()
734 struct mtk_i2c *i2c = dev_get_drvdata(dev); in mtk_i2c_resume() local
736 mtk_i2c_init_hw(i2c); in mtk_i2c_resume()