Commit 8cc9dddd authored by Linus Torvalds's avatar Linus Torvalds

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
parents 43f4d36c 0268263f
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */ #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 AT91_I2C_DMA_THRESHOLD 8 /* enable DMA if transfer size is bigger than this threshold */
#define AUTOSUSPEND_TIMEOUT 2000 #define AUTOSUSPEND_TIMEOUT 2000
#define AT91_I2C_MAX_ALT_CMD_DATA_SIZE 256
/* AT91 TWI register definitions */ /* AT91 TWI register definitions */
#define AT91_TWI_CR 0x0000 /* Control Register */ #define AT91_TWI_CR 0x0000 /* Control Register */
...@@ -141,6 +142,7 @@ struct at91_twi_dev { ...@@ -141,6 +142,7 @@ struct at91_twi_dev {
unsigned twi_cwgr_reg; unsigned twi_cwgr_reg;
struct at91_twi_pdata *pdata; struct at91_twi_pdata *pdata;
bool use_dma; bool use_dma;
bool use_alt_cmd;
bool recv_len_abort; bool recv_len_abort;
u32 fifo_size; u32 fifo_size;
struct at91_twi_dma dma; struct at91_twi_dma dma;
...@@ -269,7 +271,7 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) ...@@ -269,7 +271,7 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev)
/* send stop when last byte has been written */ /* send stop when last byte has been written */
if (--dev->buf_len == 0) 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); 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); 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) ...@@ -292,7 +294,7 @@ static void at91_twi_write_data_dma_callback(void *data)
* we just have to enable TXCOMP one. * we just have to enable TXCOMP one.
*/ */
at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); 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); 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) ...@@ -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 */ /* 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); 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); 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) ...@@ -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]), dma_unmap_single(dev->dev, sg_dma_address(&dev->dma.sg[0]),
dev->buf_len, DMA_FROM_DEVICE); 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 */ /* The last two bytes have to be read without using dma */
dev->buf += dev->buf_len - 2; dev->buf += dev->buf_len - 2;
dev->buf_len = 2; dev->buf_len = 2;
...@@ -443,7 +445,7 @@ static void at91_twi_read_data_dma(struct at91_twi_dev *dev) ...@@ -443,7 +445,7 @@ static void at91_twi_read_data_dma(struct at91_twi_dev *dev)
struct dma_chan *chan_rx = dma->chan_rx; struct dma_chan *chan_rx = dma->chan_rx;
size_t buf_len; 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; dma->direction = DMA_FROM_DEVICE;
/* Keep in mind that we won't use dma to read the last two bytes */ /* 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) ...@@ -651,7 +653,7 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev)
unsigned start_flags = AT91_TWI_START; unsigned start_flags = AT91_TWI_START;
/* if only one byte is to be read, immediately stop transfer */ /* 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)) !(dev->msg->flags & I2C_M_RECV_LEN))
start_flags |= AT91_TWI_STOP; start_flags |= AT91_TWI_STOP;
at91_twi_write(dev, AT91_TWI_CR, start_flags); 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) ...@@ -745,7 +747,7 @@ static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num)
int ret; int ret;
unsigned int_addr_flag = 0; unsigned int_addr_flag = 0;
struct i2c_msg *m_start = msg; 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); 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) ...@@ -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); at91_twi_write(dev, AT91_TWI_IADR, internal_address);
} }
dev->use_alt_cmd = false;
is_read = (m_start->flags & I2C_M_RD); is_read = (m_start->flags & I2C_M_RD);
if (dev->pdata->has_alt_cmd) { 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_CR, AT91_TWI_ACMEN);
at91_twi_write(dev, AT91_TWI_ACR, at91_twi_write(dev, AT91_TWI_ACR,
AT91_TWI_ACR_DATAL(m_start->len) | AT91_TWI_ACR_DATAL(m_start->len) |
((is_read) ? AT91_TWI_ACR_DIR : 0)); ((is_read) ? AT91_TWI_ACR_DIR : 0));
use_alt_cmd = true; dev->use_alt_cmd = true;
} else { } else {
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_ACMDIS); 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) ...@@ -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, at91_twi_write(dev, AT91_TWI_MMR,
(m_start->addr << 16) | (m_start->addr << 16) |
int_addr_flag | 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_len = m_start->len;
dev->buf = m_start->buf; dev->buf = m_start->buf;
......
...@@ -158,7 +158,7 @@ static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data) ...@@ -158,7 +158,7 @@ static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data)
if (status & BIT(IS_M_START_BUSY_SHIFT)) { if (status & BIT(IS_M_START_BUSY_SHIFT)) {
iproc_i2c->xfer_is_done = 1; iproc_i2c->xfer_is_done = 1;
complete_all(&iproc_i2c->done); complete(&iproc_i2c->done);
} }
writel(status, iproc_i2c->base + IS_OFFSET); writel(status, iproc_i2c->base + IS_OFFSET);
......
...@@ -229,7 +229,7 @@ static irqreturn_t bcm_kona_i2c_isr(int irq, void *devid) ...@@ -229,7 +229,7 @@ static irqreturn_t bcm_kona_i2c_isr(int irq, void *devid)
dev->base + TXFCR_OFFSET); dev->base + TXFCR_OFFSET);
writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET); writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET);
complete_all(&dev->done); complete(&dev->done);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -228,7 +228,7 @@ static irqreturn_t brcmstb_i2c_isr(int irq, void *devid) ...@@ -228,7 +228,7 @@ static irqreturn_t brcmstb_i2c_isr(int irq, void *devid)
return IRQ_NONE; return IRQ_NONE;
brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE); brcmstb_i2c_enable_disable_irq(dev, INT_DISABLE);
complete_all(&dev->done); complete(&dev->done);
dev_dbg(dev->device, "isr handled"); dev_dbg(dev->device, "isr handled");
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -215,7 +215,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[], ...@@ -215,7 +215,7 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
msg->outsize = request_len; msg->outsize = request_len;
msg->insize = response_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) { if (result < 0) {
dev_err(dev, "Error transferring EC i2c message %d\n", result); dev_err(dev, "Error transferring EC i2c message %d\n", result);
goto exit; goto exit;
......
...@@ -211,7 +211,7 @@ static void meson_i2c_stop(struct meson_i2c *i2c) ...@@ -211,7 +211,7 @@ static void meson_i2c_stop(struct meson_i2c *i2c)
meson_i2c_add_token(i2c, TOKEN_STOP); meson_i2c_add_token(i2c, TOKEN_STOP);
} else { } else {
i2c->state = STATE_IDLE; 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) ...@@ -238,7 +238,7 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
dev_dbg(i2c->dev, "error bit set\n"); dev_dbg(i2c->dev, "error bit set\n");
i2c->error = -ENXIO; i2c->error = -ENXIO;
i2c->state = STATE_IDLE; i2c->state = STATE_IDLE;
complete_all(&i2c->done); complete(&i2c->done);
goto out; goto out;
} }
...@@ -269,7 +269,7 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) ...@@ -269,7 +269,7 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id)
break; break;
case STATE_STOP: case STATE_STOP:
i2c->state = STATE_IDLE; i2c->state = STATE_IDLE;
complete_all(&i2c->done); complete(&i2c->done);
break; break;
case STATE_IDLE: case STATE_IDLE:
break; break;
......
...@@ -379,6 +379,7 @@ static int ocores_i2c_of_probe(struct platform_device *pdev, ...@@ -379,6 +379,7 @@ static int ocores_i2c_of_probe(struct platform_device *pdev,
if (!clock_frequency_present) { if (!clock_frequency_present) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Missing required parameter 'opencores,ip-clock-frequency'\n"); "Missing required parameter 'opencores,ip-clock-frequency'\n");
clk_disable_unprepare(i2c->clk);
return -ENODEV; return -ENODEV;
} }
i2c->ip_clock_khz = clock_frequency / 1000; i2c->ip_clock_khz = clock_frequency / 1000;
...@@ -467,20 +468,21 @@ static int ocores_i2c_probe(struct platform_device *pdev) ...@@ -467,20 +468,21 @@ static int ocores_i2c_probe(struct platform_device *pdev)
default: default:
dev_err(&pdev->dev, "Unsupported I/O width (%d)\n", dev_err(&pdev->dev, "Unsupported I/O width (%d)\n",
i2c->reg_io_width); i2c->reg_io_width);
return -EINVAL; ret = -EINVAL;
goto err_clk;
} }
} }
ret = ocores_init(&pdev->dev, i2c); ret = ocores_init(&pdev->dev, i2c);
if (ret) if (ret)
return ret; goto err_clk;
init_waitqueue_head(&i2c->wait); init_waitqueue_head(&i2c->wait);
ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0, ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0,
pdev->name, i2c); pdev->name, i2c);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Cannot claim IRQ\n"); dev_err(&pdev->dev, "Cannot claim IRQ\n");
return ret; goto err_clk;
} }
/* hook up driver to tree */ /* hook up driver to tree */
...@@ -494,7 +496,7 @@ static int ocores_i2c_probe(struct platform_device *pdev) ...@@ -494,7 +496,7 @@ static int ocores_i2c_probe(struct platform_device *pdev)
ret = i2c_add_adapter(&i2c->adap); ret = i2c_add_adapter(&i2c->adap);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Failed to add adapter\n"); dev_err(&pdev->dev, "Failed to add adapter\n");
return ret; goto err_clk;
} }
/* add in known devices to the bus */ /* add in known devices to the bus */
...@@ -504,6 +506,10 @@ static int ocores_i2c_probe(struct platform_device *pdev) ...@@ -504,6 +506,10 @@ static int ocores_i2c_probe(struct platform_device *pdev)
} }
return 0; return 0;
err_clk:
clk_disable_unprepare(i2c->clk);
return ret;
} }
static int ocores_i2c_remove(struct platform_device *pdev) 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 ...@@ -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); adap = of_find_i2c_adapter_by_node(priv->chan[new_chan].parent_np);
if (!adap) { if (!adap) {
ret = -ENODEV; ret = -ENODEV;
goto err; goto err_with_revert;
} }
p = devm_pinctrl_get_select(adap->dev.parent, priv->bus_name); 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 ...@@ -103,6 +103,8 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne
err_with_put: err_with_put:
i2c_put_adapter(adap); i2c_put_adapter(adap);
err_with_revert:
of_changeset_revert(&priv->chan[new_chan].chgset);
err: err:
dev_err(priv->dev, "failed to setup demux-adapter %d (%d)\n", new_chan, ret); dev_err(priv->dev, "failed to setup demux-adapter %d (%d)\n", new_chan, ret);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment