Lines Matching refs:bus
158 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus);
160 static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) in aspeed_i2c_recover_bus() argument
166 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
167 command = readl(bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
173 dev_dbg(bus->dev, "SCL hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
176 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
177 writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
178 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
181 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
183 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
186 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
189 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
194 dev_dbg(bus->dev, "SDA hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
197 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
200 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
201 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
204 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
206 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
209 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
212 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
218 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
223 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
225 return aspeed_i2c_reset(bus); in aspeed_i2c_recover_bus()
229 static bool aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus) in aspeed_i2c_slave_irq() argument
232 struct i2c_client *slave = bus->slave; in aspeed_i2c_slave_irq()
236 spin_lock(&bus->lock); 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()
327 spin_unlock(&bus->lock); in aspeed_i2c_slave_irq()
333 static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_start() argument
336 struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_do_start()
339 bus->master_state = ASPEED_I2C_MASTER_START; in aspeed_i2c_do_start()
340 bus->buf_index = 0; in aspeed_i2c_do_start()
350 writel(slave_addr, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_do_start()
351 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_start()
355 static void aspeed_i2c_do_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_stop() argument
357 bus->master_state = ASPEED_I2C_MASTER_STOP; in aspeed_i2c_do_stop()
358 writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_stop()
362 static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_next_msg_or_stop() argument
364 if (bus->msgs_index + 1 < bus->msgs_count) { in aspeed_i2c_next_msg_or_stop()
365 bus->msgs_index++; in aspeed_i2c_next_msg_or_stop()
366 aspeed_i2c_do_start(bus); in aspeed_i2c_next_msg_or_stop()
368 aspeed_i2c_do_stop(bus); in aspeed_i2c_next_msg_or_stop()
385 static bool aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus) in aspeed_i2c_master_irq() argument
392 spin_lock(&bus->lock); in aspeed_i2c_master_irq()
393 irq_status = readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_master_irq()
395 writel(irq_status, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_master_irq()
398 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
410 dev_dbg(bus->dev, "received error interrupt: 0x%08x", in aspeed_i2c_master_irq()
412 bus->cmd_err = ret; in aspeed_i2c_master_irq()
413 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
418 if (!bus->msgs) { in aspeed_i2c_master_irq()
419 dev_err(bus->dev, "bus in unknown state"); in aspeed_i2c_master_irq()
420 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
421 if (bus->master_state != ASPEED_I2C_MASTER_STOP) in aspeed_i2c_master_irq()
422 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
425 msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_master_irq()
432 if (bus->master_state == ASPEED_I2C_MASTER_START) { in aspeed_i2c_master_irq()
436 bus->cmd_err = -ENXIO; in aspeed_i2c_master_irq()
437 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
442 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
446 bus->master_state = ASPEED_I2C_MASTER_RX_FIRST; in aspeed_i2c_master_irq()
448 bus->master_state = ASPEED_I2C_MASTER_TX_FIRST; in aspeed_i2c_master_irq()
451 switch (bus->master_state) { in aspeed_i2c_master_irq()
454 dev_dbg(bus->dev, "slave NACKed TX"); in aspeed_i2c_master_irq()
458 dev_err(bus->dev, "slave failed to ACK TX"); in aspeed_i2c_master_irq()
464 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
465 bus->master_state = ASPEED_I2C_MASTER_TX; in aspeed_i2c_master_irq()
466 writel(msg->buf[bus->buf_index++], in aspeed_i2c_master_irq()
467 bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_master_irq()
469 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
471 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
481 dev_err(bus->dev, "master failed to RX"); in aspeed_i2c_master_irq()
486 recv_byte = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; in aspeed_i2c_master_irq()
487 msg->buf[bus->buf_index++] = recv_byte; in aspeed_i2c_master_irq()
491 bus->cmd_err = -EPROTO; in aspeed_i2c_master_irq()
492 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
500 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
501 bus->master_state = ASPEED_I2C_MASTER_RX; in aspeed_i2c_master_irq()
503 if (bus->buf_index + 1 == msg->len) in aspeed_i2c_master_irq()
505 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
507 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
512 dev_err(bus->dev, "master failed to STOP"); in aspeed_i2c_master_irq()
513 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
519 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
522 dev_err(bus->dev, in aspeed_i2c_master_irq()
525 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
530 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
531 bus->cmd_err = -EINVAL; in aspeed_i2c_master_irq()
535 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
536 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
539 bus->msgs = NULL; in aspeed_i2c_master_irq()
540 if (bus->cmd_err) in aspeed_i2c_master_irq()
541 bus->master_xfer_result = bus->cmd_err; in aspeed_i2c_master_irq()
543 bus->master_xfer_result = bus->msgs_index + 1; in aspeed_i2c_master_irq()
544 complete(&bus->cmd_complete); in aspeed_i2c_master_irq()
547 dev_err(bus->dev, in aspeed_i2c_master_irq()
550 spin_unlock(&bus->lock); in aspeed_i2c_master_irq()
556 struct aspeed_i2c_bus *bus = dev_id; in aspeed_i2c_bus_irq() local
559 if (aspeed_i2c_slave_irq(bus)) { in aspeed_i2c_bus_irq()
560 dev_dbg(bus->dev, "irq handled by slave.\n"); in aspeed_i2c_bus_irq()
565 return aspeed_i2c_master_irq(bus) ? IRQ_HANDLED : IRQ_NONE; in aspeed_i2c_bus_irq()
571 struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); in aspeed_i2c_master_xfer() local
575 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
576 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
581 if (readl(bus->base + ASPEED_I2C_CMD_REG) & ASPEED_I2CD_BUS_BUSY_STS) { in aspeed_i2c_master_xfer()
582 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
583 ret = aspeed_i2c_recover_bus(bus); in aspeed_i2c_master_xfer()
586 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
589 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
590 bus->msgs = msgs; in aspeed_i2c_master_xfer()
591 bus->msgs_index = 0; in aspeed_i2c_master_xfer()
592 bus->msgs_count = num; in aspeed_i2c_master_xfer()
594 reinit_completion(&bus->cmd_complete); in aspeed_i2c_master_xfer()
595 aspeed_i2c_do_start(bus); in aspeed_i2c_master_xfer()
596 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
598 time_left = wait_for_completion_timeout(&bus->cmd_complete, in aspeed_i2c_master_xfer()
599 bus->adap.timeout); in aspeed_i2c_master_xfer()
604 return bus->master_xfer_result; in aspeed_i2c_master_xfer()
614 static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) in __aspeed_i2c_reg_slave() argument
619 addr_reg_val = readl(bus->base + ASPEED_I2C_DEV_ADDR_REG); in __aspeed_i2c_reg_slave()
622 writel(addr_reg_val, bus->base + ASPEED_I2C_DEV_ADDR_REG); in __aspeed_i2c_reg_slave()
625 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
627 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
632 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_reg_slave() local
635 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reg_slave()
636 if (bus->slave) { in aspeed_i2c_reg_slave()
637 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
641 __aspeed_i2c_reg_slave(bus, client->addr); in aspeed_i2c_reg_slave()
643 bus->slave = client; in aspeed_i2c_reg_slave()
644 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_reg_slave()
645 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
652 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_unreg_slave() local
656 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_unreg_slave()
657 if (!bus->slave) { in aspeed_i2c_unreg_slave()
658 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
663 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
665 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
667 bus->slave = NULL; in aspeed_i2c_unreg_slave()
668 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
769 static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) in aspeed_i2c_init_clk() argument
773 divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency); in aspeed_i2c_init_clk()
774 clk_reg_val = readl(bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
778 clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); in aspeed_i2c_init_clk()
779 writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
780 writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); in aspeed_i2c_init_clk()
786 static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, in aspeed_i2c_init() argument
793 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
795 ret = aspeed_i2c_init_clk(bus); in aspeed_i2c_init()
803 writel(readl(bus->base + ASPEED_I2C_FUN_CTRL_REG) | fun_ctrl_reg, in aspeed_i2c_init()
804 bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
808 if (bus->slave) in aspeed_i2c_init()
809 __aspeed_i2c_reg_slave(bus, bus->slave->addr); in aspeed_i2c_init()
813 writel(ASPEED_I2CD_INTR_ALL, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_init()
818 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus) in aspeed_i2c_reset() argument
820 struct platform_device *pdev = to_platform_device(bus->dev); in aspeed_i2c_reset()
824 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reset()
827 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_reset()
828 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_reset()
830 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_reset()
832 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reset()
853 struct aspeed_i2c_bus *bus; in aspeed_i2c_probe_bus() local
858 bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL); in aspeed_i2c_probe_bus()
859 if (!bus) in aspeed_i2c_probe_bus()
863 bus->base = devm_ioremap_resource(&pdev->dev, res); in aspeed_i2c_probe_bus()
864 if (IS_ERR(bus->base)) in aspeed_i2c_probe_bus()
865 return PTR_ERR(bus->base); in aspeed_i2c_probe_bus()
870 bus->parent_clk_frequency = clk_get_rate(parent_clk); in aspeed_i2c_probe_bus()
875 "bus-frequency", &bus->bus_frequency); in aspeed_i2c_probe_bus()
879 bus->bus_frequency = 100000; in aspeed_i2c_probe_bus()
884 bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; in aspeed_i2c_probe_bus()
886 bus->get_clk_reg_val = (u32 (*)(struct device *, u32)) in aspeed_i2c_probe_bus()
890 spin_lock_init(&bus->lock); in aspeed_i2c_probe_bus()
891 init_completion(&bus->cmd_complete); in aspeed_i2c_probe_bus()
892 bus->adap.owner = THIS_MODULE; in aspeed_i2c_probe_bus()
893 bus->adap.retries = 0; in aspeed_i2c_probe_bus()
894 bus->adap.timeout = 5 * HZ; in aspeed_i2c_probe_bus()
895 bus->adap.algo = &aspeed_i2c_algo; in aspeed_i2c_probe_bus()
896 bus->adap.dev.parent = &pdev->dev; in aspeed_i2c_probe_bus()
897 bus->adap.dev.of_node = pdev->dev.of_node; in aspeed_i2c_probe_bus()
898 strlcpy(bus->adap.name, pdev->name, sizeof(bus->adap.name)); in aspeed_i2c_probe_bus()
899 i2c_set_adapdata(&bus->adap, bus); in aspeed_i2c_probe_bus()
901 bus->dev = &pdev->dev; in aspeed_i2c_probe_bus()
904 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_probe_bus()
905 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_probe_bus()
910 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_probe_bus()
916 0, dev_name(&pdev->dev), bus); in aspeed_i2c_probe_bus()
920 ret = i2c_add_adapter(&bus->adap); in aspeed_i2c_probe_bus()
924 platform_set_drvdata(pdev, bus); in aspeed_i2c_probe_bus()
926 dev_info(bus->dev, "i2c bus %d registered, irq %d\n", in aspeed_i2c_probe_bus()
927 bus->adap.nr, irq); in aspeed_i2c_probe_bus()
934 struct aspeed_i2c_bus *bus = platform_get_drvdata(pdev); in aspeed_i2c_remove_bus() local
937 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_remove_bus()
940 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_remove_bus()
941 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_remove_bus()
943 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_remove_bus()
945 i2c_del_adapter(&bus->adap); in aspeed_i2c_remove_bus()