Skip to content

Commit c2bf05d

Browse files
committed
Merge tag 'i2c-for-6.1-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "A power state fix in the core for ACPI devices, a regression fix regarding bus recovery for the cadence driver, a DMA handling fix for the imx driver, and two error path fixes (npcm7xx and qcom-geni)" * tag 'i2c-for-6.1-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: imx: Only DMA messages with I2C_M_DMA_SAFE flag set i2c: qcom-geni: fix error return code in geni_i2c_gpi_xfer i2c: cadence: Fix regression with bus recovery i2c: Restore initial power state if probe fails i2c: npcm7xx: Fix error handling in npcm_i2c_init()
2 parents 6085bc9 + d36678f commit c2bf05d

File tree

5 files changed

+27
-11
lines changed

5 files changed

+27
-11
lines changed

drivers/i2c/busses/i2c-cadence.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,8 @@ static int cdns_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
852852
CDNS_I2C_POLL_US, CDNS_I2C_TIMEOUT_US);
853853
if (ret) {
854854
ret = -EAGAIN;
855-
i2c_recover_bus(adap);
855+
if (id->adap.bus_recovery_info)
856+
i2c_recover_bus(adap);
856857
goto out;
857858
}
858859

@@ -1263,8 +1264,13 @@ static int cdns_i2c_probe(struct platform_device *pdev)
12631264

12641265
id->rinfo.pinctrl = devm_pinctrl_get(&pdev->dev);
12651266
if (IS_ERR(id->rinfo.pinctrl)) {
1267+
int err = PTR_ERR(id->rinfo.pinctrl);
1268+
12661269
dev_info(&pdev->dev, "can't get pinctrl, bus recovery not supported\n");
1267-
return PTR_ERR(id->rinfo.pinctrl);
1270+
if (err != -ENODEV)
1271+
return err;
1272+
} else {
1273+
id->adap.bus_recovery_info = &id->rinfo;
12681274
}
12691275

12701276
id->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r_mem);
@@ -1283,7 +1289,6 @@ static int cdns_i2c_probe(struct platform_device *pdev)
12831289
id->adap.retries = 3; /* Default retry value. */
12841290
id->adap.algo_data = id;
12851291
id->adap.dev.parent = &pdev->dev;
1286-
id->adap.bus_recovery_info = &id->rinfo;
12871292
init_completion(&id->xfer_done);
12881293
snprintf(id->adap.name, sizeof(id->adap.name),
12891294
"Cadence I2C at %08lx", (unsigned long)r_mem->start);

drivers/i2c/busses/i2c-imx.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,7 +1132,8 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
11321132
int i, result;
11331133
unsigned int temp;
11341134
int block_data = msgs->flags & I2C_M_RECV_LEN;
1135-
int use_dma = i2c_imx->dma && msgs->len >= DMA_THRESHOLD && !block_data;
1135+
int use_dma = i2c_imx->dma && msgs->flags & I2C_M_DMA_SAFE &&
1136+
msgs->len >= DMA_THRESHOLD && !block_data;
11361137

11371138
dev_dbg(&i2c_imx->adapter.dev,
11381139
"<%s> write slave address: addr=0x%x\n",
@@ -1298,7 +1299,8 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
12981299
result = i2c_imx_read(i2c_imx, &msgs[i], is_lastmsg, atomic);
12991300
} else {
13001301
if (!atomic &&
1301-
i2c_imx->dma && msgs[i].len >= DMA_THRESHOLD)
1302+
i2c_imx->dma && msgs[i].len >= DMA_THRESHOLD &&
1303+
msgs[i].flags & I2C_M_DMA_SAFE)
13021304
result = i2c_imx_dma_write(i2c_imx, &msgs[i]);
13031305
else
13041306
result = i2c_imx_write(i2c_imx, &msgs[i], atomic);

drivers/i2c/busses/i2c-npcm7xx.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2393,8 +2393,17 @@ static struct platform_driver npcm_i2c_bus_driver = {
23932393

23942394
static int __init npcm_i2c_init(void)
23952395
{
2396+
int ret;
2397+
23962398
npcm_i2c_debugfs_dir = debugfs_create_dir("npcm_i2c", NULL);
2397-
return platform_driver_register(&npcm_i2c_bus_driver);
2399+
2400+
ret = platform_driver_register(&npcm_i2c_bus_driver);
2401+
if (ret) {
2402+
debugfs_remove_recursive(npcm_i2c_debugfs_dir);
2403+
return ret;
2404+
}
2405+
2406+
return 0;
23982407
}
23992408
module_init(npcm_i2c_init);
24002409

drivers/i2c/busses/i2c-qcom-geni.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,6 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, struct i2c_msg msgs[], i
626626
dev_err(gi2c->se.dev, "I2C timeout gpi flags:%d addr:0x%x\n",
627627
gi2c->cur->flags, gi2c->cur->addr);
628628
gi2c->err = -ETIMEDOUT;
629-
goto err;
630629
}
631630

632631
if (gi2c->err) {

drivers/i2c/i2c-core-base.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ static int i2c_device_probe(struct device *dev)
467467
{
468468
struct i2c_client *client = i2c_verify_client(dev);
469469
struct i2c_driver *driver;
470+
bool do_power_on;
470471
int status;
471472

472473
if (!client)
@@ -545,8 +546,8 @@ static int i2c_device_probe(struct device *dev)
545546
if (status < 0)
546547
goto err_clear_wakeup_irq;
547548

548-
status = dev_pm_domain_attach(&client->dev,
549-
!i2c_acpi_waive_d0_probe(dev));
549+
do_power_on = !i2c_acpi_waive_d0_probe(dev);
550+
status = dev_pm_domain_attach(&client->dev, do_power_on);
550551
if (status)
551552
goto err_clear_wakeup_irq;
552553

@@ -585,7 +586,7 @@ static int i2c_device_probe(struct device *dev)
585586
err_release_driver_resources:
586587
devres_release_group(&client->dev, client->devres_group_id);
587588
err_detach_pm_domain:
588-
dev_pm_domain_detach(&client->dev, !i2c_acpi_waive_d0_probe(dev));
589+
dev_pm_domain_detach(&client->dev, do_power_on);
589590
err_clear_wakeup_irq:
590591
dev_pm_clear_wake_irq(&client->dev);
591592
device_init_wakeup(&client->dev, false);
@@ -610,7 +611,7 @@ static void i2c_device_remove(struct device *dev)
610611

611612
devres_release_group(&client->dev, client->devres_group_id);
612613

613-
dev_pm_domain_detach(&client->dev, !i2c_acpi_waive_d0_probe(dev));
614+
dev_pm_domain_detach(&client->dev, true);
614615

615616
dev_pm_clear_wake_irq(&client->dev);
616617
device_init_wakeup(&client->dev, false);

0 commit comments

Comments
 (0)