0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/err.h>
0009 #include <linux/i2c.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/pm_runtime.h>
0012
0013 #include "i2c-at91.h"
0014
0015 static irqreturn_t atmel_twi_interrupt_slave(int irq, void *dev_id)
0016 {
0017 struct at91_twi_dev *dev = dev_id;
0018 const unsigned status = at91_twi_read(dev, AT91_TWI_SR);
0019 const unsigned irqstatus = status & at91_twi_read(dev, AT91_TWI_IMR);
0020 u8 value;
0021
0022 if (!irqstatus)
0023 return IRQ_NONE;
0024
0025
0026 if (irqstatus & AT91_TWI_SVACC) {
0027 if (status & AT91_TWI_SVREAD) {
0028 i2c_slave_event(dev->slave,
0029 I2C_SLAVE_READ_REQUESTED, &value);
0030 writeb_relaxed(value, dev->base + AT91_TWI_THR);
0031 at91_twi_write(dev, AT91_TWI_IER,
0032 AT91_TWI_TXRDY | AT91_TWI_EOSACC);
0033 } else {
0034 i2c_slave_event(dev->slave,
0035 I2C_SLAVE_WRITE_REQUESTED, &value);
0036 at91_twi_write(dev, AT91_TWI_IER,
0037 AT91_TWI_RXRDY | AT91_TWI_EOSACC);
0038 }
0039 at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_SVACC);
0040 }
0041
0042
0043 if (irqstatus & AT91_TWI_TXRDY) {
0044 i2c_slave_event(dev->slave, I2C_SLAVE_READ_PROCESSED, &value);
0045 writeb_relaxed(value, dev->base + AT91_TWI_THR);
0046 }
0047
0048
0049 if (irqstatus & AT91_TWI_RXRDY) {
0050 value = readb_relaxed(dev->base + AT91_TWI_RHR);
0051 i2c_slave_event(dev->slave, I2C_SLAVE_WRITE_RECEIVED, &value);
0052 }
0053
0054
0055 if (irqstatus & AT91_TWI_EOSACC) {
0056 at91_twi_write(dev, AT91_TWI_IDR,
0057 AT91_TWI_TXRDY | AT91_TWI_RXRDY | AT91_TWI_EOSACC);
0058 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_SVACC);
0059 i2c_slave_event(dev->slave, I2C_SLAVE_STOP, &value);
0060 }
0061
0062 return IRQ_HANDLED;
0063 }
0064
0065 static int at91_reg_slave(struct i2c_client *slave)
0066 {
0067 struct at91_twi_dev *dev = i2c_get_adapdata(slave->adapter);
0068
0069 if (dev->slave)
0070 return -EBUSY;
0071
0072 if (slave->flags & I2C_CLIENT_TEN)
0073 return -EAFNOSUPPORT;
0074
0075
0076 pm_runtime_get_sync(dev->dev);
0077
0078 dev->slave = slave;
0079 dev->smr = AT91_TWI_SMR_SADR(slave->addr);
0080
0081 at91_init_twi_bus(dev);
0082 at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_SVACC);
0083
0084 dev_info(dev->dev, "entered slave mode (ADR=%d)\n", slave->addr);
0085
0086 return 0;
0087 }
0088
0089 static int at91_unreg_slave(struct i2c_client *slave)
0090 {
0091 struct at91_twi_dev *dev = i2c_get_adapdata(slave->adapter);
0092
0093 WARN_ON(!dev->slave);
0094
0095 dev_info(dev->dev, "leaving slave mode\n");
0096
0097 dev->slave = NULL;
0098 dev->smr = 0;
0099
0100 at91_init_twi_bus(dev);
0101
0102 pm_runtime_put(dev->dev);
0103
0104 return 0;
0105 }
0106
0107 static u32 at91_twi_func(struct i2c_adapter *adapter)
0108 {
0109 return I2C_FUNC_SLAVE | I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
0110 | I2C_FUNC_SMBUS_READ_BLOCK_DATA;
0111 }
0112
0113 static const struct i2c_algorithm at91_twi_algorithm_slave = {
0114 .reg_slave = at91_reg_slave,
0115 .unreg_slave = at91_unreg_slave,
0116 .functionality = at91_twi_func,
0117 };
0118
0119 int at91_twi_probe_slave(struct platform_device *pdev,
0120 u32 phy_addr, struct at91_twi_dev *dev)
0121 {
0122 int rc;
0123
0124 rc = devm_request_irq(&pdev->dev, dev->irq, atmel_twi_interrupt_slave,
0125 0, dev_name(dev->dev), dev);
0126 if (rc) {
0127 dev_err(dev->dev, "Cannot get irq %d: %d\n", dev->irq, rc);
0128 return rc;
0129 }
0130
0131 dev->adapter.algo = &at91_twi_algorithm_slave;
0132
0133 return 0;
0134 }
0135
0136 void at91_init_twi_bus_slave(struct at91_twi_dev *dev)
0137 {
0138 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSDIS);
0139 if (dev->slave_detected && dev->smr) {
0140 at91_twi_write(dev, AT91_TWI_SMR, dev->smr);
0141 at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVEN);
0142 }
0143 }