@@ -78,8 +78,7 @@ static irqreturn_t viai2c_isr(int irq, void *data)
return IRQ_HANDLED;
}
-static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg,
- int last)
+static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg, bool last)
{
u16 val, tcr_val = i2c->tcr;
int ret;
@@ -97,7 +96,7 @@ static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg,
writew(pmsg->buf[0] & 0xFF, base + VIAI2C_REG_CDR);
}
- if (!(pmsg->flags & I2C_M_NOSTART)) {
+ if (i2c->platform == VIAI2C_PLAT_WMT && !(pmsg->flags & I2C_M_NOSTART)) {
val = readw(base + VIAI2C_REG_CR);
val &= ~VIAI2C_CR_TX_END;
val |= VIAI2C_CR_CPU_RDY;
@@ -111,7 +110,7 @@ static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg,
writew(tcr_val, base + VIAI2C_REG_TCR);
- if (pmsg->flags & I2C_M_NOSTART) {
+ if (i2c->platform == VIAI2C_PLAT_WMT && pmsg->flags & I2C_M_NOSTART) {
val = readw(base + VIAI2C_REG_CR);
val |= VIAI2C_CR_CPU_RDY;
writew(val, base + VIAI2C_REG_CR);
@@ -138,7 +137,7 @@ static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg,
}
if (xfer_len == pmsg->len) {
- if (last != 1)
+ if (i2c->platform == VIAI2C_PLAT_WMT && !last)
writew(VIAI2C_CR_ENABLE, base + VIAI2C_REG_CR);
} else {
writew(pmsg->buf[xfer_len] & 0xFF,
@@ -161,7 +160,7 @@ static int viai2c_read(struct viai2c *i2c, struct i2c_msg *pmsg)
val = readw(base + VIAI2C_REG_CR);
val &= ~(VIAI2C_CR_TX_END | VIAI2C_CR_RX_END);
- if (!(pmsg->flags & I2C_M_NOSTART))
+ if (i2c->platform == VIAI2C_PLAT_WMT && !(pmsg->flags & I2C_M_NOSTART))
val |= VIAI2C_CR_CPU_RDY;
if (pmsg->len == 1)
@@ -176,7 +175,7 @@ static int viai2c_read(struct viai2c *i2c, struct i2c_msg *pmsg)
writew(tcr_val, base + VIAI2C_REG_TCR);
- if (pmsg->flags & I2C_M_NOSTART) {
+ if (i2c->platform == VIAI2C_PLAT_WMT && (pmsg->flags & I2C_M_NOSTART)) {
val = readw(base + VIAI2C_REG_CR);
val |= VIAI2C_CR_CPU_RDY;
writew(val, base + VIAI2C_REG_CR);
@@ -211,7 +210,8 @@ int viai2c_xfer(struct i2c_adapter *adap,
i2c->to = i2c->ti = ktime_get();
for (i = 0; ret >= 0 && i < num; i++) {
pmsg = &msgs[i];
- if (!(pmsg->flags & I2C_M_NOSTART)) {
+ if ((i2c->platform == VIAI2C_PLAT_WMT)
+ && !(pmsg->flags & I2C_M_NOSTART)) {
ret = viai2c_wait_bus_ready(i2c);
if (ret < 0)
return ret;
@@ -226,9 +226,10 @@ int viai2c_xfer(struct i2c_adapter *adap,
return (ret < 0) ? ret : i;
}
-int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c)
+int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c, int plat)
{
int err;
+ int irq_flags;
struct viai2c *i2c;
struct device_node *np = pdev->dev.of_node;
@@ -240,12 +241,19 @@ int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c)
if (IS_ERR(i2c->base))
return PTR_ERR(i2c->base);
- i2c->irq = irq_of_parse_and_map(np, 0);
- if (!i2c->irq)
- return -EINVAL;
+ if (plat == VIAI2C_PLAT_WMT) {
+ irq_flags = 0;
+ i2c->irq = irq_of_parse_and_map(np, 0);
+ if (!i2c->irq)
+ return -EINVAL;
+ } else
+ return dev_err_probe(&pdev->dev, -EINVAL,
+ "wrong platform type\n");
+
+ i2c->platform = plat;
err = devm_request_irq(&pdev->dev, i2c->irq, viai2c_isr,
- 0, pdev->name, i2c);
+ irq_flags, pdev->name, i2c);
if (err)
return dev_err_probe(&pdev->dev, err,
"failed to request irq %i\n", i2c->irq);
@@ -49,6 +49,10 @@
#define VIAI2C_REG_TR 0x0C
#define VIAI2C_REG_MCR 0x0E
+enum {
+ VIAI2C_PLAT_WMT = 1,
+};
+
struct viai2c {
struct i2c_adapter adapter;
struct completion complete;
@@ -60,9 +64,10 @@ struct viai2c {
u16 cmd_status;
ktime_t ti;
ktime_t to;
+ int platform;
};
int viai2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num);
-int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c);
+int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c, int plat);
#endif
@@ -76,7 +76,7 @@ static int wmt_i2c_probe(struct platform_device *pdev)
int err;
u32 clk_rate;
- err = viai2c_init(pdev, &i2c);
+ err = viai2c_init(pdev, &i2c, VIAI2C_PLAT_WMT);
if (err)
return err;
Enumeration variables are added to differentiate between different platforms. Signed-off-by: Hans Hu <hanshu-oc@zhaoxin.com> --- drivers/i2c/busses/i2c-viai2c-common.c | 34 ++++++++++++++++---------- drivers/i2c/busses/i2c-viai2c-common.h | 7 +++++- drivers/i2c/busses/i2c-wmt-plt.c | 2 +- 3 files changed, 28 insertions(+), 15 deletions(-)