Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "I2C has some pretty standard driver bugfixes and one minor cleanup" * 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: meson: Use complete() instead of complete_all() i2c: brcmstb: Use complete() instead of complete_all() i2c: bcm-kona: Use complete() instead of complete_all() i2c: bcm-iproc: Use complete() instead of complete_all() i2c: at91: fix support of the "alternative command" feature i2c: ocores: add missed clk_disable_unprepare() on failure paths i2c: cros-ec-tunnel: Fix usage of cros_ec_cmd_xfer() i2c: mux: demux-pinctrl: properly roll back when adding adapter fails
This commit is contained in:
commit
8cc9dddd38
|
@ -38,6 +38,7 @@
|
|||
#define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */
|
||||
#define AT91_I2C_DMA_THRESHOLD 8 /* enable DMA if transfer size is bigger than this threshold */
|
||||
#define AUTOSUSPEND_TIMEOUT 2000
|
||||
#define AT91_I2C_MAX_ALT_CMD_DATA_SIZE 256
|
||||
|
||||
/* AT91 TWI register definitions */
|
||||
#define AT91_TWI_CR 0x0000 /* Control Register */
|
||||
|
@ -141,6 +142,7 @@ struct at91_twi_dev {
|
|||
unsigned twi_cwgr_reg;
|
||||
struct at91_twi_pdata *pdata;
|
||||
bool use_dma;
|
||||
bool use_alt_cmd;
|
||||
bool recv_len_abort;
|
||||
u32 fifo_size;
|
||||
struct at91_twi_dma dma;
|
||||
|
@ -269,7 +271,7 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev)
|
|||
|
||||
/* send stop when last byte has been written */
|
||||
if (--dev->buf_len == 0)
|
||||
if (!dev->pdata->has_alt_cmd)
|
||||
if (!dev->use_alt_cmd)
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
|
||||
|
||||
dev_dbg(dev->dev, "wrote 0x%x, to go %d\n", *dev->buf, dev->buf_len);
|
||||
|
@ -292,7 +294,7 @@ static void at91_twi_write_data_dma_callback(void *data)
|
|||
* we just have to enable TXCOMP one.
|
||||
*/
|
||||
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP);
|
||||
if (!dev->pdata->has_alt_cmd)
|
||||
if (!dev->use_alt_cmd)
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
|
||||
}
|
||||
|
||||
|
@ -410,7 +412,7 @@ static void at91_twi_read_next_byte(struct at91_twi_dev *dev)
|
|||
}
|
||||
|
||||
/* send stop if second but last byte has been read */
|
||||
if (!dev->pdata->has_alt_cmd && dev->buf_len == 1)
|
||||
if (!dev->use_alt_cmd && dev->buf_len == 1)
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP);
|
||||
|
||||
dev_dbg(dev->dev, "read 0x%x, to go %d\n", *dev->buf, dev->buf_len);
|
||||
|
@ -426,7 +428,7 @@ static void at91_twi_read_data_dma_callback(void *data)
|
|||
dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]),
|
||||
dev->buf_len, DMA_FROM_DEVICE);
|
||||
|
||||
if (!dev->pdata->has_alt_cmd) {
|
||||
if (!dev->use_alt_cmd) {
|
||||
/* The last two bytes have to be read without using dma */
|
||||
dev->buf += dev->buf_len - 2;
|
||||
dev->buf_len = 2;
|
||||
|
@ -443,7 +445,7 @@ static void at91_twi_read_data_dma(struct at91_twi_dev *dev)
|
|||
struct dma_chan *chan_rx = dma->chan_rx;
|
||||
size_t buf_len;
|
||||
|
||||
buf_len = (dev->pdata->has_alt_cmd) ? dev->buf_len : dev->buf_len - 2;
|
||||
buf_len = (dev->use_alt_cmd) ? dev->buf_len : dev->buf_len - 2;
|
||||
dma->direction = DMA_FROM_DEVICE;
|
||||
|
||||
/* Keep in mind that we won't use dma to read the last two bytes */
|
||||
|
@ -651,7 +653,7 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
|
|||
unsigned start_flags = AT91_TWI_START;
|
||||
|
||||
/* if only one byte is to be read, immediately stop transfer */
|
||||
if (!has_alt_cmd && dev->buf_len <= 1 &&
|
||||
if (!dev->use_alt_cmd && dev->buf_len <= 1 &&
|
||||
!(dev->msg->flags & I2C_M_RECV_LEN))
|
||||
start_flags |= AT91_TWI_STOP;
|
||||
at91_twi_write(dev, AT91_TWI_CR, start_flags);
|
||||
|
@ -745,7 +747,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
|
|||
int ret;
|
||||
unsigned int_addr_flag = 0;
|
||||
struct i2c_msg *m_start = msg;
|
||||
bool is_read, use_alt_cmd = false;
|
||||
bool is_read;
|
||||
|
||||
dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num);
|
||||
|
||||
|
@ -768,14 +770,16 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
|
|||
at91_twi_write(dev, AT91_TWI_IADR, internal_address);
|
||||
}
|
||||
|
||||
dev->use_alt_cmd = false;
|
||||
is_read = (m_start->flags & I2C_M_RD);
|
||||
if (dev->pdata->has_alt_cmd) {
|
||||
if (m_start->len > 0) {
|
||||
if (m_start->len > 0 &&
|
||||
m_start->len < AT91_I2C_MAX_ALT_CMD_DATA_SIZE) {
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_ACMEN);
|
||||
at91_twi_write(dev, AT91_TWI_ACR,
|
||||
AT91_TWI_ACR_DATAL(m_start->len) |
|
||||
((is_read) ? AT91_TWI_ACR_DIR : 0));
|
||||
use_alt_cmd = true;
|
||||
dev->use_alt_cmd = true;
|
||||
} else {
|
||||
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_ACMDIS);
|
||||
}
|
||||
|
@ -784,7 +788,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
|
|||
at91_twi_write(dev, AT91_TWI_MMR,
|
||||
(m_start->addr << 16) |
|
||||
int_addr_flag |
|
||||
((!use_alt_cmd && is_read) ? AT91_TWI_MREAD : 0));
|
||||
((!dev->use_alt_cmd && is_read) ? AT91_TWI_MREAD : 0));
|
||||
|
||||
dev->buf_len = m_start->len;
|
||||
dev->buf = m_start->buf;
|
||||
|
|
|
@ -158,7 +158,7 @@ static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data)
|
|||
|
||||
if (status & BIT(IS_M_START_BUSY_SHIFT)) {
|
||||
iproc_i2c->xfer_is_done = 1;
|
||||
complete_all(&iproc_i2c->done);
|
||||
complete(&iproc_i2c->done);
|
||||
}
|
||||
|
||||
writel(status, iproc_i2c->base + IS_OFFSET);
|
||||
|
|
|
@ -229,7 +229,7 @@ static irqreturn_t bcm_kona_i2c_isr(int irq, void *devid)
|
|||
dev->base + TXFCR_OFFSET);
|
||||
|
||||
writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET);
|
||||
complete_all(&dev->done);
|
||||
complete(&dev->done);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -228,7 +228,7 @@ static irqreturn_t brcmstb_i2c_isr(int irq, void *devid)
|
|||
return IRQ_NONE;
|
||||
|
||||
brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE);
|
||||
complete_all(&dev->done);
|
||||
complete(&dev->done);
|
||||
|
||||
dev_dbg(dev->device, "isr handled");
|
||||
return IRQ_HANDLED;
|
||||
|
|
|
@ -215,7 +215,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
|
|||
msg->outsize = request_len;
|
||||
msg->insize = response_len;
|
||||
|
||||
result = cros_ec_cmd_xfer(bus->ec, msg);
|
||||
result = cros_ec_cmd_xfer_status(bus->ec, msg);
|
||||
if (result < 0) {
|
||||
dev_err(dev, "Error transferring EC i2c message %d\n", result);
|
||||
goto exit;
|
||||
|
|
|
@ -211,7 +211,7 @@ static void meson_i2c_stop(struct meson_i2c *i2c)
|
|||
meson_i2c_add_token(i2c, TOKEN_STOP);
|
||||
} else {
|
||||
i2c->state = STATE_IDLE;
|
||||
complete_all(&i2c->done);
|
||||
complete(&i2c->done);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -238,7 +238,7 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
|
|||
dev_dbg(i2c->dev, "error bit set\n");
|
||||
i2c->error = -ENXIO;
|
||||
i2c->state = STATE_IDLE;
|
||||
complete_all(&i2c->done);
|
||||
complete(&i2c->done);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -269,7 +269,7 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
|
|||
break;
|
||||
case STATE_STOP:
|
||||
i2c->state = STATE_IDLE;
|
||||
complete_all(&i2c->done);
|
||||
complete(&i2c->done);
|
||||
break;
|
||||
case STATE_IDLE:
|
||||
break;
|
||||
|
|
|
@ -379,6 +379,7 @@ static int ocores_i2c_of_probe(struct platform_device *pdev,
|
|||
if (!clock_frequency_present) {
|
||||
dev_err(&pdev->dev,
|
||||
"Missing required parameter 'opencores,ip-clock-frequency'\n");
|
||||
clk_disable_unprepare(i2c->clk);
|
||||
return -ENODEV;
|
||||
}
|
||||
i2c->ip_clock_khz = clock_frequency / 1000;
|
||||
|
@ -467,20 +468,21 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
|||
default:
|
||||
dev_err(&pdev->dev, "Unsupported I/O width (%d)\n",
|
||||
i2c->reg_io_width);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err_clk;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ocores_init(&pdev->dev, i2c);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_clk;
|
||||
|
||||
init_waitqueue_head(&i2c->wait);
|
||||
ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0,
|
||||
pdev->name, i2c);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Cannot claim IRQ\n");
|
||||
return ret;
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
/* hook up driver to tree */
|
||||
|
@ -494,7 +496,7 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
|||
ret = i2c_add_adapter(&i2c->adap);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to add adapter\n");
|
||||
return ret;
|
||||
goto err_clk;
|
||||
}
|
||||
|
||||
/* add in known devices to the bus */
|
||||
|
@ -504,6 +506,10 @@ static int ocores_i2c_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_clk:
|
||||
clk_disable_unprepare(i2c->clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ocores_i2c_remove(struct platform_device *pdev)
|
||||
|
|
|
@ -68,7 +68,7 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne
|
|||
adap = of_find_i2c_adapter_by_node(priv->chan[new_chan].parent_np);
|
||||
if (!adap) {
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
goto err_with_revert;
|
||||
}
|
||||
|
||||
p = devm_pinctrl_get_select(adap->dev.parent, priv->bus_name);
|
||||
|
@ -103,6 +103,8 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne
|
|||
|
||||
err_with_put:
|
||||
i2c_put_adapter(adap);
|
||||
err_with_revert:
|
||||
of_changeset_revert(&priv->chan[new_chan].chgset);
|
||||
err:
|
||||
dev_err(priv->dev, "failed to setup demux-adapter %d (%d)\n", new_chan, ret);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue