Lines Matching refs:bus
159 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus);
161 static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) in aspeed_i2c_recover_bus() argument
167 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
168 command = readl(bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
174 dev_dbg(bus->dev, "SCL hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
177 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
178 writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
179 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
182 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
184 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
187 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
190 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
195 dev_dbg(bus->dev, "SDA hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
198 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
201 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
202 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
205 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
207 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
210 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
213 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
219 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
224 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
226 return aspeed_i2c_reset(bus); in aspeed_i2c_recover_bus()
230 static bool aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus) in aspeed_i2c_slave_irq() argument
233 struct i2c_client *slave = bus->slave; in aspeed_i2c_slave_irq()
242 command = readl(bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
243 irq_status = readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_slave_irq()
248 bus->slave_state = ASPEED_I2C_SLAVE_START; in aspeed_i2c_slave_irq()
252 if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) { in aspeed_i2c_slave_irq()
257 dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", in aspeed_i2c_slave_irq()
262 value = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; in aspeed_i2c_slave_irq()
264 if (bus->slave_state == ASPEED_I2C_SLAVE_START) { in aspeed_i2c_slave_irq()
266 bus->slave_state = in aspeed_i2c_slave_irq()
269 bus->slave_state = in aspeed_i2c_slave_irq()
278 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_slave_irq()
282 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_slave_irq()
285 switch (bus->slave_state) { in aspeed_i2c_slave_irq()
288 dev_err(bus->dev, "Unexpected ACK on read request.\n"); in aspeed_i2c_slave_irq()
289 bus->slave_state = ASPEED_I2C_SLAVE_READ_PROCESSED; in aspeed_i2c_slave_irq()
292 writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_slave_irq()
293 writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
298 dev_err(bus->dev, in aspeed_i2c_slave_irq()
301 writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_slave_irq()
302 writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
305 bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; in aspeed_i2c_slave_irq()
315 dev_err(bus->dev, "unhandled slave_state: %d\n", in aspeed_i2c_slave_irq()
316 bus->slave_state); in aspeed_i2c_slave_irq()
321 dev_err(bus->dev, in aspeed_i2c_slave_irq()
324 writel(status_ack, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_slave_irq()
332 static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_start() argument
335 struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_do_start()
338 bus->master_state = ASPEED_I2C_MASTER_START; in aspeed_i2c_do_start()
339 bus->buf_index = 0; in aspeed_i2c_do_start()
348 writel(slave_addr, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_do_start()
349 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_start()
353 static void aspeed_i2c_do_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_stop() argument
355 bus->master_state = ASPEED_I2C_MASTER_STOP; in aspeed_i2c_do_stop()
356 writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_stop()
360 static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_next_msg_or_stop() argument
362 if (bus->msgs_index + 1 < bus->msgs_count) { in aspeed_i2c_next_msg_or_stop()
363 bus->msgs_index++; in aspeed_i2c_next_msg_or_stop()
364 aspeed_i2c_do_start(bus); in aspeed_i2c_next_msg_or_stop()
366 aspeed_i2c_do_stop(bus); in aspeed_i2c_next_msg_or_stop()
383 static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) in aspeed_i2c_master_irq() argument
390 irq_status = readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_master_irq()
392 writel(irq_status, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_master_irq()
395 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
407 dev_dbg(bus->dev, "received error interrupt: 0x%08x\n", in aspeed_i2c_master_irq()
409 bus->cmd_err = ret; in aspeed_i2c_master_irq()
410 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
415 if (!bus->msgs) { in aspeed_i2c_master_irq()
416 dev_err(bus->dev, "bus in unknown state\n"); in aspeed_i2c_master_irq()
417 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
418 if (bus->master_state != ASPEED_I2C_MASTER_STOP) in aspeed_i2c_master_irq()
419 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
422 msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_master_irq()
429 if (bus->master_state == ASPEED_I2C_MASTER_START) { in aspeed_i2c_master_irq()
433 bus->cmd_err = -ENXIO; in aspeed_i2c_master_irq()
434 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
439 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
443 bus->master_state = ASPEED_I2C_MASTER_RX_FIRST; in aspeed_i2c_master_irq()
445 bus->master_state = ASPEED_I2C_MASTER_TX_FIRST; in aspeed_i2c_master_irq()
448 switch (bus->master_state) { in aspeed_i2c_master_irq()
451 dev_dbg(bus->dev, "slave NACKed TX\n"); in aspeed_i2c_master_irq()
455 dev_err(bus->dev, "slave failed to ACK TX\n"); in aspeed_i2c_master_irq()
461 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
462 bus->master_state = ASPEED_I2C_MASTER_TX; in aspeed_i2c_master_irq()
463 writel(msg->buf[bus->buf_index++], in aspeed_i2c_master_irq()
464 bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_master_irq()
466 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
468 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
478 dev_err(bus->dev, "master failed to RX\n"); in aspeed_i2c_master_irq()
483 recv_byte = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; in aspeed_i2c_master_irq()
484 msg->buf[bus->buf_index++] = recv_byte; in aspeed_i2c_master_irq()
488 bus->cmd_err = -EPROTO; in aspeed_i2c_master_irq()
489 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
497 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
498 bus->master_state = ASPEED_I2C_MASTER_RX; in aspeed_i2c_master_irq()
500 if (bus->buf_index + 1 == msg->len) in aspeed_i2c_master_irq()
502 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
504 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
509 dev_err(bus->dev, "master failed to STOP\n"); in aspeed_i2c_master_irq()
510 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
516 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
519 dev_err(bus->dev, in aspeed_i2c_master_irq()
522 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
527 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
528 bus->cmd_err = -EINVAL; in aspeed_i2c_master_irq()
532 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
533 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
536 bus->msgs = NULL; in aspeed_i2c_master_irq()
537 if (bus->cmd_err) in aspeed_i2c_master_irq()
538 bus->master_xfer_result = bus->cmd_err; in aspeed_i2c_master_irq()
540 bus->master_xfer_result = bus->msgs_index + 1; in aspeed_i2c_master_irq()
541 complete(&bus->cmd_complete); in aspeed_i2c_master_irq()
544 dev_err(bus->dev, in aspeed_i2c_master_irq()
552 struct aspeed_i2c_bus *bus = dev_id; in aspeed_i2c_bus_irq() local
555 spin_lock(&bus->lock); in aspeed_i2c_bus_irq()
558 if (aspeed_i2c_slave_irq(bus)) { in aspeed_i2c_bus_irq()
559 dev_dbg(bus->dev, "irq handled by slave.\n"); in aspeed_i2c_bus_irq()
565 ret = aspeed_i2c_master_irq(bus); in aspeed_i2c_bus_irq()
568 spin_unlock(&bus->lock); in aspeed_i2c_bus_irq()
575 struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); in aspeed_i2c_master_xfer() local
579 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
580 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
585 if (readl(bus->base + ASPEED_I2C_CMD_REG) & ASPEED_I2CD_BUS_BUSY_STS) { in aspeed_i2c_master_xfer()
586 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
587 ret = aspeed_i2c_recover_bus(bus); in aspeed_i2c_master_xfer()
590 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
593 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
594 bus->msgs = msgs; in aspeed_i2c_master_xfer()
595 bus->msgs_index = 0; in aspeed_i2c_master_xfer()
596 bus->msgs_count = num; in aspeed_i2c_master_xfer()
598 reinit_completion(&bus->cmd_complete); in aspeed_i2c_master_xfer()
599 aspeed_i2c_do_start(bus); in aspeed_i2c_master_xfer()
600 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
602 time_left = wait_for_completion_timeout(&bus->cmd_complete, in aspeed_i2c_master_xfer()
603 bus->adap.timeout); in aspeed_i2c_master_xfer()
608 return bus->master_xfer_result; in aspeed_i2c_master_xfer()
618 static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) in __aspeed_i2c_reg_slave() argument
623 addr_reg_val = readl(bus->base + ASPEED_I2C_DEV_ADDR_REG); in __aspeed_i2c_reg_slave()
626 writel(addr_reg_val, bus->base + ASPEED_I2C_DEV_ADDR_REG); in __aspeed_i2c_reg_slave()
629 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
631 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
636 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_reg_slave() local
639 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reg_slave()
640 if (bus->slave) { in aspeed_i2c_reg_slave()
641 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
645 __aspeed_i2c_reg_slave(bus, client->addr); in aspeed_i2c_reg_slave()
647 bus->slave = client; in aspeed_i2c_reg_slave()
648 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_reg_slave()
649 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
656 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_unreg_slave() local
660 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_unreg_slave()
661 if (!bus->slave) { in aspeed_i2c_unreg_slave()
662 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
667 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
669 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
671 bus->slave = NULL; in aspeed_i2c_unreg_slave()
672 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
750 static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) in aspeed_i2c_init_clk() argument
754 divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency); in aspeed_i2c_init_clk()
755 clk_reg_val = readl(bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
759 clk_reg_val |= bus->get_clk_reg_val(divisor); in aspeed_i2c_init_clk()
760 writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
761 writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); in aspeed_i2c_init_clk()
767 static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, in aspeed_i2c_init() argument
774 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
776 ret = aspeed_i2c_init_clk(bus); in aspeed_i2c_init()
784 writel(readl(bus->base + ASPEED_I2C_FUN_CTRL_REG) | fun_ctrl_reg, in aspeed_i2c_init()
785 bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
789 if (bus->slave) in aspeed_i2c_init()
790 __aspeed_i2c_reg_slave(bus, bus->slave->addr); in aspeed_i2c_init()
794 writel(ASPEED_I2CD_INTR_ALL, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_init()
799 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus) in aspeed_i2c_reset() argument
801 struct platform_device *pdev = to_platform_device(bus->dev); in aspeed_i2c_reset()
805 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reset()
808 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_reset()
809 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_reset()
811 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_reset()
813 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reset()
834 struct aspeed_i2c_bus *bus; in aspeed_i2c_probe_bus() local
839 bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL); in aspeed_i2c_probe_bus()
840 if (!bus) in aspeed_i2c_probe_bus()
844 bus->base = devm_ioremap_resource(&pdev->dev, res); in aspeed_i2c_probe_bus()
845 if (IS_ERR(bus->base)) in aspeed_i2c_probe_bus()
846 return PTR_ERR(bus->base); in aspeed_i2c_probe_bus()
851 bus->parent_clk_frequency = clk_get_rate(parent_clk); in aspeed_i2c_probe_bus()
855 bus->rst = devm_reset_control_get_shared(&pdev->dev, NULL); in aspeed_i2c_probe_bus()
856 if (IS_ERR(bus->rst)) { in aspeed_i2c_probe_bus()
859 return PTR_ERR(bus->rst); in aspeed_i2c_probe_bus()
861 reset_control_deassert(bus->rst); in aspeed_i2c_probe_bus()
864 "bus-frequency", &bus->bus_frequency); in aspeed_i2c_probe_bus()
868 bus->bus_frequency = 100000; in aspeed_i2c_probe_bus()
873 bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; in aspeed_i2c_probe_bus()
875 bus->get_clk_reg_val = (u32 (*)(u32))match->data; in aspeed_i2c_probe_bus()
878 spin_lock_init(&bus->lock); in aspeed_i2c_probe_bus()
879 init_completion(&bus->cmd_complete); in aspeed_i2c_probe_bus()
880 bus->adap.owner = THIS_MODULE; in aspeed_i2c_probe_bus()
881 bus->adap.retries = 0; in aspeed_i2c_probe_bus()
882 bus->adap.timeout = 5 * HZ; in aspeed_i2c_probe_bus()
883 bus->adap.algo = &aspeed_i2c_algo; in aspeed_i2c_probe_bus()
884 bus->adap.dev.parent = &pdev->dev; in aspeed_i2c_probe_bus()
885 bus->adap.dev.of_node = pdev->dev.of_node; in aspeed_i2c_probe_bus()
886 strlcpy(bus->adap.name, pdev->name, sizeof(bus->adap.name)); in aspeed_i2c_probe_bus()
887 i2c_set_adapdata(&bus->adap, bus); in aspeed_i2c_probe_bus()
889 bus->dev = &pdev->dev; in aspeed_i2c_probe_bus()
892 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_probe_bus()
893 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_probe_bus()
898 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_probe_bus()
904 0, dev_name(&pdev->dev), bus); in aspeed_i2c_probe_bus()
908 ret = i2c_add_adapter(&bus->adap); in aspeed_i2c_probe_bus()
912 platform_set_drvdata(pdev, bus); in aspeed_i2c_probe_bus()
914 dev_info(bus->dev, "i2c bus %d registered, irq %d\n", in aspeed_i2c_probe_bus()
915 bus->adap.nr, irq); in aspeed_i2c_probe_bus()
922 struct aspeed_i2c_bus *bus = platform_get_drvdata(pdev); in aspeed_i2c_remove_bus() local
925 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_remove_bus()
928 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_remove_bus()
929 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_remove_bus()
931 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_remove_bus()
933 reset_control_assert(bus->rst); in aspeed_i2c_remove_bus()
935 i2c_del_adapter(&bus->adap); in aspeed_i2c_remove_bus()