Skip to content

Commit 51b1ac0

Browse files
committed
Merge branch 'i2c/for-current-fixed' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "A set of driver bugfixes and an improvement for a core helper" * 'i2c/for-current-fixed' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: i2c-designware-platdrv: Always use a dynamic adapter number i2c: i2c-designware-platdrv: Cleanup setting of the adapter number i2c: add extra check to safe DMA buffer helper i2c: i2c-stm32f7: Fix SDADEL minimum formula i2c: rcar: explain the lockless design i2c: rcar: fix concurrency issue related to ICDMAER i2c: sis630: correct format strings i2c: mediatek: modify threshold passed to i2c_get_dma_safe_msg_buf()
2 parents 2dbb0e6 + cd86d14 commit 51b1ac0

File tree

6 files changed

+29
-16
lines changed

6 files changed

+29
-16
lines changed

drivers/i2c/busses/i2c-designware-platdrv.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ static int dw_i2c_acpi_configure(struct platform_device *pdev)
8686
struct i2c_timings *t = &dev->timings;
8787
u32 ss_ht = 0, fp_ht = 0, hs_ht = 0, fs_ht = 0;
8888

89-
dev->adapter.nr = -1;
9089
dev->tx_fifo_depth = 32;
9190
dev->rx_fifo_depth = 32;
9291

@@ -219,7 +218,7 @@ static void i2c_dw_configure_slave(struct dw_i2c_dev *dev)
219218
dev->mode = DW_IC_SLAVE;
220219
}
221220

222-
static void dw_i2c_set_fifo_size(struct dw_i2c_dev *dev, int id)
221+
static void dw_i2c_set_fifo_size(struct dw_i2c_dev *dev)
223222
{
224223
u32 param, tx_fifo_depth, rx_fifo_depth;
225224

@@ -233,7 +232,6 @@ static void dw_i2c_set_fifo_size(struct dw_i2c_dev *dev, int id)
233232
if (!dev->tx_fifo_depth) {
234233
dev->tx_fifo_depth = tx_fifo_depth;
235234
dev->rx_fifo_depth = rx_fifo_depth;
236-
dev->adapter.nr = id;
237235
} else if (tx_fifo_depth >= 2) {
238236
dev->tx_fifo_depth = min_t(u32, dev->tx_fifo_depth,
239237
tx_fifo_depth);
@@ -358,13 +356,14 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
358356
div_u64(clk_khz * t->sda_hold_ns + 500000, 1000000);
359357
}
360358

361-
dw_i2c_set_fifo_size(dev, pdev->id);
359+
dw_i2c_set_fifo_size(dev);
362360

363361
adap = &dev->adapter;
364362
adap->owner = THIS_MODULE;
365363
adap->class = I2C_CLASS_DEPRECATED;
366364
ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));
367365
adap->dev.of_node = pdev->dev.of_node;
366+
adap->nr = -1;
368367

369368
dev_pm_set_driver_flags(&pdev->dev,
370369
DPM_FLAG_SMART_PREPARE |

drivers/i2c/busses/i2c-mt65xx.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
503503
writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG);
504504
writel(I2C_DMA_CON_RX, i2c->pdmabase + OFFSET_CON);
505505

506-
dma_rd_buf = i2c_get_dma_safe_msg_buf(msgs, 0);
506+
dma_rd_buf = i2c_get_dma_safe_msg_buf(msgs, 1);
507507
if (!dma_rd_buf)
508508
return -ENOMEM;
509509

@@ -526,7 +526,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
526526
writel(I2C_DMA_INT_FLAG_NONE, i2c->pdmabase + OFFSET_INT_FLAG);
527527
writel(I2C_DMA_CON_TX, i2c->pdmabase + OFFSET_CON);
528528

529-
dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0);
529+
dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 1);
530530
if (!dma_wr_buf)
531531
return -ENOMEM;
532532

@@ -549,7 +549,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
549549
writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_INT_FLAG);
550550
writel(I2C_DMA_CLR_FLAG, i2c->pdmabase + OFFSET_CON);
551551

552-
dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 0);
552+
dma_wr_buf = i2c_get_dma_safe_msg_buf(msgs, 1);
553553
if (!dma_wr_buf)
554554
return -ENOMEM;
555555

@@ -561,7 +561,7 @@ static int mtk_i2c_do_transfer(struct mtk_i2c *i2c, struct i2c_msg *msgs,
561561
return -ENOMEM;
562562
}
563563

564-
dma_rd_buf = i2c_get_dma_safe_msg_buf((msgs + 1), 0);
564+
dma_rd_buf = i2c_get_dma_safe_msg_buf((msgs + 1), 1);
565565
if (!dma_rd_buf) {
566566
dma_unmap_single(i2c->dev, wpaddr,
567567
msgs->len, DMA_TO_DEVICE);

drivers/i2c/busses/i2c-rcar.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,6 @@ static void rcar_i2c_dma_unmap(struct rcar_i2c_priv *priv)
363363
struct dma_chan *chan = priv->dma_direction == DMA_FROM_DEVICE
364364
? priv->dma_rx : priv->dma_tx;
365365

366-
/* Disable DMA Master Received/Transmitted */
367-
rcar_i2c_write(priv, ICDMAER, 0);
368-
369366
dma_unmap_single(chan->device->dev, sg_dma_address(&priv->sg),
370367
sg_dma_len(&priv->sg), priv->dma_direction);
371368

@@ -375,6 +372,9 @@ static void rcar_i2c_dma_unmap(struct rcar_i2c_priv *priv)
375372
priv->flags |= ID_P_NO_RXDMA;
376373

377374
priv->dma_direction = DMA_NONE;
375+
376+
/* Disable DMA Master Received/Transmitted, must be last! */
377+
rcar_i2c_write(priv, ICDMAER, 0);
378378
}
379379

380380
static void rcar_i2c_cleanup_dma(struct rcar_i2c_priv *priv)
@@ -611,6 +611,15 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
611611
return true;
612612
}
613613

614+
/*
615+
* This driver has a lock-free design because there are IP cores (at least
616+
* R-Car Gen2) which have an inherent race condition in their hardware design.
617+
* There, we need to clear RCAR_BUS_MASK_DATA bits as soon as possible after
618+
* the interrupt was generated, otherwise an unwanted repeated message gets
619+
* generated. It turned out that taking a spinlock at the beginning of the ISR
620+
* was already causing repeated messages. Thus, this driver was converted to
621+
* the now lockless behaviour. Please keep this in mind when hacking the driver.
622+
*/
614623
static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
615624
{
616625
struct rcar_i2c_priv *priv = ptr;

drivers/i2c/busses/i2c-sis630.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ static int sis630_setup(struct pci_dev *sis630_dev)
478478
if (!request_region(smbus_base + SMB_STS, SIS630_SMB_IOREGION,
479479
sis630_driver.name)) {
480480
dev_err(&sis630_dev->dev,
481-
"I/O Region 0x%04hx-0x%04hx for SMBus already in use.\n",
481+
"I/O Region 0x%04x-0x%04x for SMBus already in use.\n",
482482
smbus_base + SMB_STS,
483483
smbus_base + SMB_STS + SIS630_SMB_IOREGION - 1);
484484
retval = -EBUSY;
@@ -528,7 +528,7 @@ static int sis630_probe(struct pci_dev *dev, const struct pci_device_id *id)
528528
sis630_adapter.dev.parent = &dev->dev;
529529

530530
snprintf(sis630_adapter.name, sizeof(sis630_adapter.name),
531-
"SMBus SIS630 adapter at %04hx", smbus_base + SMB_STS);
531+
"SMBus SIS630 adapter at %04x", smbus_base + SMB_STS);
532532

533533
return i2c_add_adapter(&sis630_adapter);
534534
}

drivers/i2c/busses/i2c-stm32f7.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev,
432432
STM32F7_I2C_ANALOG_FILTER_DELAY_MAX : 0);
433433
dnf_delay = setup->dnf * i2cclk;
434434

435-
sdadel_min = setup->fall_time - i2c_specs[setup->speed].hddat_min -
435+
sdadel_min = i2c_specs[setup->speed].hddat_min + setup->fall_time -
436436
af_delay_min - (setup->dnf + 3) * i2cclk;
437437

438438
sdadel_max = i2c_specs[setup->speed].vddat_max - setup->rise_time -

drivers/i2c/i2c-core-base.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,7 +2258,8 @@ EXPORT_SYMBOL(i2c_put_adapter);
22582258
/**
22592259
* i2c_get_dma_safe_msg_buf() - get a DMA safe buffer for the given i2c_msg
22602260
* @msg: the message to be checked
2261-
* @threshold: the minimum number of bytes for which using DMA makes sense
2261+
* @threshold: the minimum number of bytes for which using DMA makes sense.
2262+
* Should at least be 1.
22622263
*
22632264
* Return: NULL if a DMA safe buffer was not obtained. Use msg->buf with PIO.
22642265
* Or a valid pointer to be used with DMA. After use, release it by
@@ -2268,7 +2269,11 @@ EXPORT_SYMBOL(i2c_put_adapter);
22682269
*/
22692270
u8 *i2c_get_dma_safe_msg_buf(struct i2c_msg *msg, unsigned int threshold)
22702271
{
2271-
if (msg->len < threshold)
2272+
/* also skip 0-length msgs for bogus thresholds of 0 */
2273+
if (!threshold)
2274+
pr_debug("DMA buffer for addr=0x%02x with length 0 is bogus\n",
2275+
msg->addr);
2276+
if (msg->len < threshold || msg->len == 0)
22722277
return NULL;
22732278

22742279
if (msg->flags & I2C_M_DMA_SAFE)

0 commit comments

Comments
 (0)