Lines Matching +full:ast2500 +full:- +full:i2c +full:- +full:bus
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Aspeed 24XX/25XX I2C Controller.
5 * Copyright (C) 2012-2017 ASPEED Technology Inc.
14 #include <linux/i2c.h>
28 /* I2C Register */
39 /* 0x00 : I2C Interrupt Status Register */
40 /* 0x08 : I2C Interrupt Target Assignment */
163 /* Multi-master */
171 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus);
173 /* precondition: bus.lock has been acquired. */
174 static void aspeed_i2c_do_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_stop() argument
176 bus->master_state = ASPEED_I2C_MASTER_STOP; in aspeed_i2c_do_stop()
177 writel(ASPEED_I2CD_M_STOP_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_stop()
180 static int aspeed_i2c_recover_bus(struct aspeed_i2c_bus *bus) in aspeed_i2c_recover_bus() argument
186 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
187 command = readl(bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
190 /* Bus is idle: no recovery needed. */ in aspeed_i2c_recover_bus()
193 dev_dbg(bus->dev, "SCL hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
196 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
197 aspeed_i2c_do_stop(bus); in aspeed_i2c_recover_bus()
198 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
201 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
203 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
206 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
209 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
212 /* Bus error. */ in aspeed_i2c_recover_bus()
214 dev_dbg(bus->dev, "SDA hung (state %x), attempting recovery\n", in aspeed_i2c_recover_bus()
217 reinit_completion(&bus->cmd_complete); in aspeed_i2c_recover_bus()
220 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_recover_bus()
221 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
224 &bus->cmd_complete, bus->adap.timeout); in aspeed_i2c_recover_bus()
226 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_recover_bus()
229 else if (bus->cmd_err) in aspeed_i2c_recover_bus()
232 else if (!(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_recover_bus()
238 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
243 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_recover_bus()
245 return aspeed_i2c_reset(bus); in aspeed_i2c_recover_bus()
249 static u32 aspeed_i2c_slave_irq(struct aspeed_i2c_bus *bus, u32 irq_status) in aspeed_i2c_slave_irq() argument
252 struct i2c_client *slave = bus->slave; in aspeed_i2c_slave_irq()
267 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_slave_irq()
271 bus->slave_state == ASPEED_I2C_SLAVE_READ_PROCESSED) { in aspeed_i2c_slave_irq()
273 bus->slave_state = ASPEED_I2C_SLAVE_STOP; in aspeed_i2c_slave_irq()
277 if (bus->slave_state == ASPEED_I2C_SLAVE_STOP) { in aspeed_i2c_slave_irq()
279 bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE; in aspeed_i2c_slave_irq()
288 bus->slave_state = ASPEED_I2C_SLAVE_START; in aspeed_i2c_slave_irq()
295 if (bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) in aspeed_i2c_slave_irq()
298 command = readl(bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
299 dev_dbg(bus->dev, "slave irq status 0x%08x, cmd 0x%08x\n", in aspeed_i2c_slave_irq()
304 value = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; in aspeed_i2c_slave_irq()
306 if (bus->slave_state == ASPEED_I2C_SLAVE_START) { in aspeed_i2c_slave_irq()
308 bus->slave_state = in aspeed_i2c_slave_irq()
311 bus->slave_state = in aspeed_i2c_slave_irq()
317 switch (bus->slave_state) { in aspeed_i2c_slave_irq()
320 dev_err(bus->dev, "Unexpected ACK on read request.\n"); in aspeed_i2c_slave_irq()
321 bus->slave_state = ASPEED_I2C_SLAVE_READ_PROCESSED; in aspeed_i2c_slave_irq()
323 writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_slave_irq()
324 writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
328 dev_err(bus->dev, in aspeed_i2c_slave_irq()
334 writel(value, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_slave_irq()
335 writel(ASPEED_I2CD_S_TX_CMD, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
338 bus->slave_state = ASPEED_I2C_SLAVE_WRITE_RECEIVED; in aspeed_i2c_slave_irq()
342 * returns an errno, the bus driver should nack the next incoming byte. in aspeed_i2c_slave_irq()
345 writel(ASPEED_I2CD_M_S_RX_CMD_LAST, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_slave_irq()
357 dev_err(bus->dev, "unknown slave_state: %d\n", in aspeed_i2c_slave_irq()
358 bus->slave_state); in aspeed_i2c_slave_irq()
359 bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE; in aspeed_i2c_slave_irq()
367 /* precondition: bus.lock has been acquired. */
368 static void aspeed_i2c_do_start(struct aspeed_i2c_bus *bus) in aspeed_i2c_do_start() argument
371 struct i2c_msg *msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_do_start()
378 * command when the bus comes back to the idle state. in aspeed_i2c_do_start()
380 if (bus->slave_state != ASPEED_I2C_SLAVE_INACTIVE) { in aspeed_i2c_do_start()
381 bus->master_state = ASPEED_I2C_MASTER_PENDING; in aspeed_i2c_do_start()
386 bus->master_state = ASPEED_I2C_MASTER_START; in aspeed_i2c_do_start()
387 bus->buf_index = 0; in aspeed_i2c_do_start()
389 if (msg->flags & I2C_M_RD) { in aspeed_i2c_do_start()
392 if (msg->len == 1 && !(msg->flags & I2C_M_RECV_LEN)) in aspeed_i2c_do_start()
396 writel(slave_addr, bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_do_start()
397 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_do_start()
400 /* precondition: bus.lock has been acquired. */
401 static void aspeed_i2c_next_msg_or_stop(struct aspeed_i2c_bus *bus) in aspeed_i2c_next_msg_or_stop() argument
403 if (bus->msgs_index + 1 < bus->msgs_count) { in aspeed_i2c_next_msg_or_stop()
404 bus->msgs_index++; in aspeed_i2c_next_msg_or_stop()
405 aspeed_i2c_do_start(bus); in aspeed_i2c_next_msg_or_stop()
407 aspeed_i2c_do_stop(bus); in aspeed_i2c_next_msg_or_stop()
414 return -EAGAIN; in aspeed_i2c_is_irq_error()
417 return -EBUSY; in aspeed_i2c_is_irq_error()
419 return -EPROTO; in aspeed_i2c_is_irq_error()
424 static u32 aspeed_i2c_master_irq(struct aspeed_i2c_bus *bus, u32 irq_status) in aspeed_i2c_master_irq() argument
432 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
444 dev_dbg(bus->dev, "received error interrupt: 0x%08x\n", in aspeed_i2c_master_irq()
447 if (bus->master_state != ASPEED_I2C_MASTER_INACTIVE) { in aspeed_i2c_master_irq()
448 bus->cmd_err = ret; in aspeed_i2c_master_irq()
449 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
455 if (bus->master_state == ASPEED_I2C_MASTER_INACTIVE || in aspeed_i2c_master_irq()
456 bus->master_state == ASPEED_I2C_MASTER_PENDING) in aspeed_i2c_master_irq()
459 /* We are in an invalid state; reset bus to a known state. */ in aspeed_i2c_master_irq()
460 if (!bus->msgs) { in aspeed_i2c_master_irq()
461 dev_err(bus->dev, "bus in unknown state. irq_status: 0x%x\n", in aspeed_i2c_master_irq()
463 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
464 if (bus->master_state != ASPEED_I2C_MASTER_STOP && in aspeed_i2c_master_irq()
465 bus->master_state != ASPEED_I2C_MASTER_INACTIVE) in aspeed_i2c_master_irq()
466 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
469 msg = &bus->msgs[bus->msgs_index]; in aspeed_i2c_master_irq()
476 if (bus->master_state == ASPEED_I2C_MASTER_START) { in aspeed_i2c_master_irq()
486 writel(readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_master_irq()
488 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
489 bus->master_state = ASPEED_I2C_MASTER_PENDING; in aspeed_i2c_master_irq()
490 dev_dbg(bus->dev, in aspeed_i2c_master_irq()
497 bus->cmd_err = -ENXIO; in aspeed_i2c_master_irq()
498 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
501 pr_devel("no slave present at %02x\n", msg->addr); in aspeed_i2c_master_irq()
503 bus->cmd_err = -ENXIO; in aspeed_i2c_master_irq()
504 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
508 if (msg->len == 0) { /* SMBUS_QUICK */ in aspeed_i2c_master_irq()
509 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
512 if (msg->flags & I2C_M_RD) in aspeed_i2c_master_irq()
513 bus->master_state = ASPEED_I2C_MASTER_RX_FIRST; in aspeed_i2c_master_irq()
515 bus->master_state = ASPEED_I2C_MASTER_TX_FIRST; in aspeed_i2c_master_irq()
518 switch (bus->master_state) { in aspeed_i2c_master_irq()
521 dev_dbg(bus->dev, "slave NACKed TX\n"); in aspeed_i2c_master_irq()
525 dev_err(bus->dev, "slave failed to ACK TX\n"); in aspeed_i2c_master_irq()
531 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
532 bus->master_state = ASPEED_I2C_MASTER_TX; in aspeed_i2c_master_irq()
533 writel(msg->buf[bus->buf_index++], in aspeed_i2c_master_irq()
534 bus->base + ASPEED_I2C_BYTE_BUF_REG); in aspeed_i2c_master_irq()
536 bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
538 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
548 dev_err(bus->dev, "master failed to RX\n"); in aspeed_i2c_master_irq()
553 recv_byte = readl(bus->base + ASPEED_I2C_BYTE_BUF_REG) >> 8; in aspeed_i2c_master_irq()
554 msg->buf[bus->buf_index++] = recv_byte; in aspeed_i2c_master_irq()
556 if (msg->flags & I2C_M_RECV_LEN) { in aspeed_i2c_master_irq()
558 bus->cmd_err = -EPROTO; in aspeed_i2c_master_irq()
559 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
562 msg->len = recv_byte + in aspeed_i2c_master_irq()
563 ((msg->flags & I2C_CLIENT_PEC) ? 2 : 1); in aspeed_i2c_master_irq()
564 msg->flags &= ~I2C_M_RECV_LEN; in aspeed_i2c_master_irq()
567 if (bus->buf_index < msg->len) { in aspeed_i2c_master_irq()
568 bus->master_state = ASPEED_I2C_MASTER_RX; in aspeed_i2c_master_irq()
570 if (bus->buf_index + 1 == msg->len) in aspeed_i2c_master_irq()
572 writel(command, bus->base + ASPEED_I2C_CMD_REG); in aspeed_i2c_master_irq()
574 aspeed_i2c_next_msg_or_stop(bus); in aspeed_i2c_master_irq()
579 dev_err(bus->dev, in aspeed_i2c_master_irq()
582 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
588 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
591 dev_err(bus->dev, in aspeed_i2c_master_irq()
594 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
599 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_irq()
600 bus->cmd_err = -EINVAL; in aspeed_i2c_master_irq()
604 bus->cmd_err = -EIO; in aspeed_i2c_master_irq()
605 aspeed_i2c_do_stop(bus); in aspeed_i2c_master_irq()
608 bus->msgs = NULL; in aspeed_i2c_master_irq()
609 if (bus->cmd_err) in aspeed_i2c_master_irq()
610 bus->master_xfer_result = bus->cmd_err; in aspeed_i2c_master_irq()
612 bus->master_xfer_result = bus->msgs_index + 1; in aspeed_i2c_master_irq()
613 complete(&bus->cmd_complete); in aspeed_i2c_master_irq()
620 struct aspeed_i2c_bus *bus = dev_id; in aspeed_i2c_bus_irq() local
623 spin_lock(&bus->lock); in aspeed_i2c_bus_irq()
624 irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_bus_irq()
627 bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_bus_irq()
628 readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_bus_irq()
640 if (bus->master_state != ASPEED_I2C_MASTER_INACTIVE && in aspeed_i2c_bus_irq()
641 bus->master_state != ASPEED_I2C_MASTER_PENDING) { in aspeed_i2c_bus_irq()
642 irq_handled = aspeed_i2c_master_irq(bus, irq_remaining); in aspeed_i2c_bus_irq()
645 irq_handled |= aspeed_i2c_slave_irq(bus, irq_remaining); in aspeed_i2c_bus_irq()
647 irq_handled = aspeed_i2c_slave_irq(bus, irq_remaining); in aspeed_i2c_bus_irq()
650 irq_handled |= aspeed_i2c_master_irq(bus, in aspeed_i2c_bus_irq()
658 if (bus->master_state == ASPEED_I2C_MASTER_PENDING && in aspeed_i2c_bus_irq()
659 bus->slave_state == ASPEED_I2C_SLAVE_INACTIVE) in aspeed_i2c_bus_irq()
660 aspeed_i2c_do_start(bus); in aspeed_i2c_bus_irq()
662 irq_handled = aspeed_i2c_master_irq(bus, irq_remaining); in aspeed_i2c_bus_irq()
667 dev_err(bus->dev, in aspeed_i2c_bus_irq()
674 bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_bus_irq()
675 readl(bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_bus_irq()
677 spin_unlock(&bus->lock); in aspeed_i2c_bus_irq()
684 struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); in aspeed_i2c_master_xfer() local
687 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
688 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
690 /* If bus is busy in a single master environment, attempt recovery. */ in aspeed_i2c_master_xfer()
691 if (!bus->multi_master && in aspeed_i2c_master_xfer()
692 (readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_master_xfer()
696 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
697 ret = aspeed_i2c_recover_bus(bus); in aspeed_i2c_master_xfer()
700 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
703 bus->cmd_err = 0; in aspeed_i2c_master_xfer()
704 bus->msgs = msgs; in aspeed_i2c_master_xfer()
705 bus->msgs_index = 0; in aspeed_i2c_master_xfer()
706 bus->msgs_count = num; in aspeed_i2c_master_xfer()
708 reinit_completion(&bus->cmd_complete); in aspeed_i2c_master_xfer()
709 aspeed_i2c_do_start(bus); in aspeed_i2c_master_xfer()
710 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
712 time_left = wait_for_completion_timeout(&bus->cmd_complete, in aspeed_i2c_master_xfer()
713 bus->adap.timeout); in aspeed_i2c_master_xfer()
717 * In a multi-master setup, if a timeout occurs, attempt in aspeed_i2c_master_xfer()
718 * recovery. But if the bus is idle, we still need to reset the in aspeed_i2c_master_xfer()
719 * i2c controller to clear the remaining interrupts. in aspeed_i2c_master_xfer()
721 if (bus->multi_master && in aspeed_i2c_master_xfer()
722 (readl(bus->base + ASPEED_I2C_CMD_REG) & in aspeed_i2c_master_xfer()
724 aspeed_i2c_recover_bus(bus); in aspeed_i2c_master_xfer()
726 aspeed_i2c_reset(bus); in aspeed_i2c_master_xfer()
732 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_master_xfer()
733 if (bus->master_state == ASPEED_I2C_MASTER_PENDING) in aspeed_i2c_master_xfer()
734 bus->master_state = ASPEED_I2C_MASTER_INACTIVE; in aspeed_i2c_master_xfer()
735 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_master_xfer()
737 return -ETIMEDOUT; in aspeed_i2c_master_xfer()
740 return bus->master_xfer_result; in aspeed_i2c_master_xfer()
749 /* precondition: bus.lock has been acquired. */
750 static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr) in __aspeed_i2c_reg_slave() argument
757 * enable a single slave address (ast2500 has two, ast2600 has three, in __aspeed_i2c_reg_slave()
759 * end up with additional phantom devices responding on the bus. in __aspeed_i2c_reg_slave()
762 writel(addr_reg_val, bus->base + ASPEED_I2C_DEV_ADDR_REG); in __aspeed_i2c_reg_slave()
765 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
767 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in __aspeed_i2c_reg_slave()
769 bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE; in __aspeed_i2c_reg_slave()
774 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_reg_slave() local
777 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reg_slave()
778 if (bus->slave) { in aspeed_i2c_reg_slave()
779 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
780 return -EINVAL; in aspeed_i2c_reg_slave()
783 __aspeed_i2c_reg_slave(bus, client->addr); in aspeed_i2c_reg_slave()
785 bus->slave = client; in aspeed_i2c_reg_slave()
786 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reg_slave()
793 struct aspeed_i2c_bus *bus = i2c_get_adapdata(client->adapter); in aspeed_i2c_unreg_slave() local
797 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_unreg_slave()
798 if (!bus->slave) { in aspeed_i2c_unreg_slave()
799 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
800 return -EINVAL; in aspeed_i2c_unreg_slave()
804 func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
806 writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_unreg_slave()
808 bus->slave = NULL; in aspeed_i2c_unreg_slave()
809 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_unreg_slave()
856 * clk_low >= clk_low_max / 2 - 1 when possible; this last constraint in aspeed_i2c_get_clk_reg_val()
860 ilog2((divisor - 1) / clk_high_low_max) + 1 : 0; in aspeed_i2c_get_clk_reg_val()
870 tmp = (divisor + (1 << base_clk_divisor) - 1) in aspeed_i2c_get_clk_reg_val()
873 clk_high = tmp - clk_low; in aspeed_i2c_get_clk_reg_val()
876 clk_high--; in aspeed_i2c_get_clk_reg_val()
879 clk_low--; in aspeed_i2c_get_clk_reg_val()
909 /* precondition: bus.lock has been acquired. */
910 static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus) in aspeed_i2c_init_clk() argument
914 divisor = DIV_ROUND_UP(bus->parent_clk_frequency, bus->bus_frequency); in aspeed_i2c_init_clk()
915 clk_reg_val = readl(bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
919 clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor); in aspeed_i2c_init_clk()
920 writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1); in aspeed_i2c_init_clk()
921 writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2); in aspeed_i2c_init_clk()
926 /* precondition: bus.lock has been acquired. */
927 static int aspeed_i2c_init(struct aspeed_i2c_bus *bus, in aspeed_i2c_init() argument
934 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
936 ret = aspeed_i2c_init_clk(bus); in aspeed_i2c_init()
940 if (of_property_read_bool(pdev->dev.of_node, "multi-master")) in aspeed_i2c_init()
941 bus->multi_master = true; in aspeed_i2c_init()
946 writel(readl(bus->base + ASPEED_I2C_FUN_CTRL_REG) | fun_ctrl_reg, in aspeed_i2c_init()
947 bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_init()
950 /* If slave has already been registered, re-enable it. */ in aspeed_i2c_init()
951 if (bus->slave) in aspeed_i2c_init()
952 __aspeed_i2c_reg_slave(bus, bus->slave->addr); in aspeed_i2c_init()
955 /* Set interrupt generation of I2C controller */ in aspeed_i2c_init()
956 writel(ASPEED_I2CD_INTR_ALL, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_init()
961 static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus) in aspeed_i2c_reset() argument
963 struct platform_device *pdev = to_platform_device(bus->dev); in aspeed_i2c_reset()
967 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_reset()
970 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_reset()
971 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_reset()
973 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_reset()
975 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_reset()
982 .compatible = "aspeed,ast2400-i2c-bus",
986 .compatible = "aspeed,ast2500-i2c-bus",
990 .compatible = "aspeed,ast2600-i2c-bus",
1000 struct aspeed_i2c_bus *bus; in aspeed_i2c_probe_bus() local
1004 bus = devm_kzalloc(&pdev->dev, sizeof(*bus), GFP_KERNEL); in aspeed_i2c_probe_bus()
1005 if (!bus) in aspeed_i2c_probe_bus()
1006 return -ENOMEM; in aspeed_i2c_probe_bus()
1008 bus->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in aspeed_i2c_probe_bus()
1009 if (IS_ERR(bus->base)) in aspeed_i2c_probe_bus()
1010 return PTR_ERR(bus->base); in aspeed_i2c_probe_bus()
1012 parent_clk = devm_clk_get(&pdev->dev, NULL); in aspeed_i2c_probe_bus()
1015 bus->parent_clk_frequency = clk_get_rate(parent_clk); in aspeed_i2c_probe_bus()
1017 devm_clk_put(&pdev->dev, parent_clk); in aspeed_i2c_probe_bus()
1019 bus->rst = devm_reset_control_get_shared(&pdev->dev, NULL); in aspeed_i2c_probe_bus()
1020 if (IS_ERR(bus->rst)) { in aspeed_i2c_probe_bus()
1021 dev_err(&pdev->dev, in aspeed_i2c_probe_bus()
1023 return PTR_ERR(bus->rst); in aspeed_i2c_probe_bus()
1025 reset_control_deassert(bus->rst); in aspeed_i2c_probe_bus()
1027 ret = of_property_read_u32(pdev->dev.of_node, in aspeed_i2c_probe_bus()
1028 "bus-frequency", &bus->bus_frequency); in aspeed_i2c_probe_bus()
1030 dev_err(&pdev->dev, in aspeed_i2c_probe_bus()
1031 "Could not read bus-frequency property\n"); in aspeed_i2c_probe_bus()
1032 bus->bus_frequency = I2C_MAX_STANDARD_MODE_FREQ; in aspeed_i2c_probe_bus()
1035 match = of_match_node(aspeed_i2c_bus_of_table, pdev->dev.of_node); in aspeed_i2c_probe_bus()
1037 bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val; in aspeed_i2c_probe_bus()
1039 bus->get_clk_reg_val = (u32 (*)(struct device *, u32)) in aspeed_i2c_probe_bus()
1040 match->data; in aspeed_i2c_probe_bus()
1042 /* Initialize the I2C adapter */ in aspeed_i2c_probe_bus()
1043 spin_lock_init(&bus->lock); in aspeed_i2c_probe_bus()
1044 init_completion(&bus->cmd_complete); in aspeed_i2c_probe_bus()
1045 bus->adap.owner = THIS_MODULE; in aspeed_i2c_probe_bus()
1046 bus->adap.retries = 0; in aspeed_i2c_probe_bus()
1047 bus->adap.algo = &aspeed_i2c_algo; in aspeed_i2c_probe_bus()
1048 bus->adap.dev.parent = &pdev->dev; in aspeed_i2c_probe_bus()
1049 bus->adap.dev.of_node = pdev->dev.of_node; in aspeed_i2c_probe_bus()
1050 strscpy(bus->adap.name, pdev->name, sizeof(bus->adap.name)); in aspeed_i2c_probe_bus()
1051 i2c_set_adapdata(&bus->adap, bus); in aspeed_i2c_probe_bus()
1053 bus->dev = &pdev->dev; in aspeed_i2c_probe_bus()
1056 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_probe_bus()
1057 writel(0xffffffff, bus->base + ASPEED_I2C_INTR_STS_REG); in aspeed_i2c_probe_bus()
1059 * bus.lock does not need to be held because the interrupt handler has in aspeed_i2c_probe_bus()
1062 ret = aspeed_i2c_init(bus, pdev); in aspeed_i2c_probe_bus()
1066 irq = irq_of_parse_and_map(pdev->dev.of_node, 0); in aspeed_i2c_probe_bus()
1067 ret = devm_request_irq(&pdev->dev, irq, aspeed_i2c_bus_irq, in aspeed_i2c_probe_bus()
1068 0, dev_name(&pdev->dev), bus); in aspeed_i2c_probe_bus()
1072 ret = i2c_add_adapter(&bus->adap); in aspeed_i2c_probe_bus()
1076 platform_set_drvdata(pdev, bus); in aspeed_i2c_probe_bus()
1078 dev_info(bus->dev, "i2c bus %d registered, irq %d\n", in aspeed_i2c_probe_bus()
1079 bus->adap.nr, irq); in aspeed_i2c_probe_bus()
1086 struct aspeed_i2c_bus *bus = platform_get_drvdata(pdev); in aspeed_i2c_remove_bus() local
1089 spin_lock_irqsave(&bus->lock, flags); in aspeed_i2c_remove_bus()
1092 writel(0, bus->base + ASPEED_I2C_FUN_CTRL_REG); in aspeed_i2c_remove_bus()
1093 writel(0, bus->base + ASPEED_I2C_INTR_CTRL_REG); in aspeed_i2c_remove_bus()
1095 spin_unlock_irqrestore(&bus->lock, flags); in aspeed_i2c_remove_bus()
1097 reset_control_assert(bus->rst); in aspeed_i2c_remove_bus()
1099 i2c_del_adapter(&bus->adap); in aspeed_i2c_remove_bus()
1106 .name = "aspeed-i2c-bus",
1113 MODULE_DESCRIPTION("Aspeed I2C Bus Driver");