Commit b06204c7 authored by Hans Hu's avatar Hans Hu Committed by Andi Shyti
Browse files

i2c: wmt: add platform type VIAI2C_PLAT_WMT



Enumeration variables are added to differentiate
between different platforms.

Acked-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: default avatarHans Hu <hanshu-oc@zhaoxin.com>
Signed-off-by: default avatarAndi Shyti <andi.shyti@kernel.org>
parent 2e829ccc
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg, int last)
		writew(pmsg->buf[0] & 0xFF, i2c->base + VIAI2C_REG_CDR);
	}

	if (!(pmsg->flags & I2C_M_NOSTART)) {
	if (i2c->platform == VIAI2C_PLAT_WMT && !(pmsg->flags & I2C_M_NOSTART)) {
		val = readw(i2c->base + VIAI2C_REG_CR);
		val &= ~VIAI2C_CR_TX_END;
		val |= VIAI2C_CR_CPU_RDY;
@@ -48,7 +48,7 @@ static int viai2c_write(struct viai2c *i2c, struct i2c_msg *pmsg, int last)

	writew(tcr_val, i2c->base + VIAI2C_REG_TCR);

	if (pmsg->flags & I2C_M_NOSTART) {
	if (i2c->platform == VIAI2C_PLAT_WMT && pmsg->flags & I2C_M_NOSTART) {
		val = readw(i2c->base + VIAI2C_REG_CR);
		val |= VIAI2C_CR_CPU_RDY;
		writew(val, i2c->base + VIAI2C_REG_CR);
@@ -67,7 +67,7 @@ static int viai2c_read(struct viai2c *i2c, struct i2c_msg *pmsg)
	val = readw(i2c->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)
@@ -81,7 +81,7 @@ static int viai2c_read(struct viai2c *i2c, struct i2c_msg *pmsg)

	writew(tcr_val, i2c->base + VIAI2C_REG_TCR);

	if (pmsg->flags & I2C_M_NOSTART) {
	if (i2c->platform == VIAI2C_PLAT_WMT && (pmsg->flags & I2C_M_NOSTART)) {
		val = readw(i2c->base + VIAI2C_REG_CR);
		val |= VIAI2C_CR_CPU_RDY;
		writew(val, i2c->base + VIAI2C_REG_CR);
@@ -102,7 +102,7 @@ int viai2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)

	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_not_busy(i2c);
			if (ret < 0)
				return ret;
@@ -155,7 +155,7 @@ static int viai2c_irq_xfer(struct viai2c *i2c)
		}

		if ((i2c->xfered_len + 1) == msg->len) {
			if (!i2c->last)
			if (i2c->platform == VIAI2C_PLAT_WMT && !i2c->last)
				writew(VIAI2C_CR_ENABLE, base + VIAI2C_REG_CR);
		} else {
			writew(msg->buf[i2c->xfered_len + 1] & 0xFF, base + VIAI2C_REG_CDR);
@@ -181,7 +181,7 @@ static irqreturn_t viai2c_isr(int irq, void *data)
	if (status & VIAI2C_ISR_NACK_ADDR)
		i2c->ret = -EIO;

	if (status & VIAI2C_ISR_SCL_TIMEOUT)
	if (i2c->platform == VIAI2C_PLAT_WMT && (status & VIAI2C_ISR_SCL_TIMEOUT))
		i2c->ret = -ETIMEDOUT;

	if (!i2c->ret)
@@ -194,9 +194,10 @@ static irqreturn_t viai2c_isr(int irq, void *data)
	return IRQ_HANDLED;
}

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;

@@ -208,12 +209,19 @@ int viai2c_init(struct platform_device *pdev, struct viai2c **pi2c)
	if (IS_ERR(i2c->base))
		return PTR_ERR(i2c->base);

	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);
+6 −1
Original line number Diff line number Diff line
@@ -50,6 +50,10 @@

#define VIAI2C_TIMEOUT		(msecs_to_jiffies(1000))

enum {
	VIAI2C_PLAT_WMT,
};

struct viai2c {
	struct i2c_adapter	adapter;
	struct completion	complete;
@@ -62,10 +66,11 @@ struct viai2c {
	struct i2c_msg		*msg;
	int			ret;
	bool			last;
	unsigned int		platform;
};

int viai2c_wait_bus_not_busy(struct viai2c *i2c);
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
+1 −1
Original line number Diff line number Diff line
@@ -80,7 +80,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;