diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 7 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-imx-lpi2c.c | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-uniphier-f.c | 7 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-uniphier.c | 7 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-xiic.c | 4 | 
5 files changed, 14 insertions, 12 deletions
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 04b60a349d7e..c91e145ef5a5 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -140,6 +140,7 @@  #define SBREG_BAR		0x10  #define SBREG_SMBCTRL		0xc6000c +#define SBREG_SMBCTRL_DNV	0xcf000c  /* Host status bits for SMBPCISTS */  #define SMBPCISTS_INTS		BIT(3) @@ -1399,7 +1400,11 @@ static void i801_add_tco(struct i801_priv *priv)  	spin_unlock(&p2sb_spinlock);  	res = &tco_res[ICH_RES_MEM_OFF]; -	res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL; +	if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) +		res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV; +	else +		res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL; +  	res->end = res->start + 3;  	res->flags = IORESOURCE_MEM; diff --git a/drivers/i2c/busses/i2c-imx-lpi2c.c b/drivers/i2c/busses/i2c-imx-lpi2c.c index 6d975f5221ca..06c4c767af32 100644 --- a/drivers/i2c/busses/i2c-imx-lpi2c.c +++ b/drivers/i2c/busses/i2c-imx-lpi2c.c @@ -538,7 +538,6 @@ static const struct i2c_algorithm lpi2c_imx_algo = {  static const struct of_device_id lpi2c_imx_of_match[] = {  	{ .compatible = "fsl,imx7ulp-lpi2c" }, -	{ .compatible = "fsl,imx8dv-lpi2c" },  	{ },  };  MODULE_DEVICE_TABLE(of, lpi2c_imx_of_match); diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c index 9918bdd81619..a403e8579b65 100644 --- a/drivers/i2c/busses/i2c-uniphier-f.c +++ b/drivers/i2c/busses/i2c-uniphier-f.c @@ -401,11 +401,8 @@ static int uniphier_fi2c_master_xfer(struct i2c_adapter *adap,  		return ret;  	for (msg = msgs; msg < emsg; msg++) { -		/* If next message is read, skip the stop condition */ -		bool stop = !(msg + 1 < emsg && msg[1].flags & I2C_M_RD); -		/* but, force it if I2C_M_STOP is set */ -		if (msg->flags & I2C_M_STOP) -			stop = true; +		/* Emit STOP if it is the last message or I2C_M_STOP is set. */ +		bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP);  		ret = uniphier_fi2c_master_xfer_one(adap, msg, stop);  		if (ret) diff --git a/drivers/i2c/busses/i2c-uniphier.c b/drivers/i2c/busses/i2c-uniphier.c index bb181b088291..454f914ae66d 100644 --- a/drivers/i2c/busses/i2c-uniphier.c +++ b/drivers/i2c/busses/i2c-uniphier.c @@ -248,11 +248,8 @@ static int uniphier_i2c_master_xfer(struct i2c_adapter *adap,  		return ret;  	for (msg = msgs; msg < emsg; msg++) { -		/* If next message is read, skip the stop condition */ -		bool stop = !(msg + 1 < emsg && msg[1].flags & I2C_M_RD); -		/* but, force it if I2C_M_STOP is set */ -		if (msg->flags & I2C_M_STOP) -			stop = true; +		/* Emit STOP if it is the last message or I2C_M_STOP is set. */ +		bool stop = (msg + 1 == emsg) || (msg->flags & I2C_M_STOP);  		ret = uniphier_i2c_master_xfer_one(adap, msg, stop);  		if (ret) diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c index 9a71e50d21f1..0c51c0ffdda9 100644 --- a/drivers/i2c/busses/i2c-xiic.c +++ b/drivers/i2c/busses/i2c-xiic.c @@ -532,6 +532,7 @@ static void xiic_start_recv(struct xiic_i2c *i2c)  {  	u8 rx_watermark;  	struct i2c_msg *msg = i2c->rx_msg = i2c->tx_msg; +	unsigned long flags;  	/* Clear and enable Rx full interrupt. */  	xiic_irq_clr_en(i2c, XIIC_INTR_RX_FULL_MASK | XIIC_INTR_TX_ERROR_MASK); @@ -547,6 +548,7 @@ static void xiic_start_recv(struct xiic_i2c *i2c)  		rx_watermark = IIC_RX_FIFO_DEPTH;  	xiic_setreg8(i2c, XIIC_RFD_REG_OFFSET, rx_watermark - 1); +	local_irq_save(flags);  	if (!(msg->flags & I2C_M_NOSTART))  		/* write the address */  		xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, @@ -556,6 +558,8 @@ static void xiic_start_recv(struct xiic_i2c *i2c)  	xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET,  		msg->len | ((i2c->nmsgs == 1) ? XIIC_TX_DYN_STOP_MASK : 0)); +	local_irq_restore(flags); +  	if (i2c->nmsgs == 1)  		/* very last, enable bus not busy as well */  		xiic_irq_clr_en(i2c, XIIC_INTR_BNB_MASK);  |