Skip to content

Commit e3f259d

Browse files
committed
Merge tag 'i2c-for-6.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c fixes from Wolfram Sang: "A revert to fix a regression introduced this merge window and a fix for proper error handling in the remove path of the iMX driver" * tag 'i2c-for-6.0-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: i2c: imx: Make sure to unregister adapter on remove() Revert "i2c: scmi: Replace open coded device_get_match_data()"
2 parents 367bcbc + d98bdd3 commit e3f259d

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

drivers/i2c/busses/i2c-imx.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,9 +1572,7 @@ static int i2c_imx_remove(struct platform_device *pdev)
15721572
struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev);
15731573
int irq, ret;
15741574

1575-
ret = pm_runtime_resume_and_get(&pdev->dev);
1576-
if (ret < 0)
1577-
return ret;
1575+
ret = pm_runtime_get_sync(&pdev->dev);
15781576

15791577
hrtimer_cancel(&i2c_imx->slave_timer);
15801578

@@ -1585,17 +1583,21 @@ static int i2c_imx_remove(struct platform_device *pdev)
15851583
if (i2c_imx->dma)
15861584
i2c_imx_dma_free(i2c_imx);
15871585

1588-
/* setup chip registers to defaults */
1589-
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR);
1590-
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR);
1591-
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR);
1592-
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR);
1586+
if (ret == 0) {
1587+
/* setup chip registers to defaults */
1588+
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR);
1589+
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR);
1590+
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR);
1591+
imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR);
1592+
clk_disable(i2c_imx->clk);
1593+
}
15931594

15941595
clk_notifier_unregister(i2c_imx->clk, &i2c_imx->clk_change_nb);
15951596
irq = platform_get_irq(pdev, 0);
15961597
if (irq >= 0)
15971598
free_irq(irq, i2c_imx);
1598-
clk_disable_unprepare(i2c_imx->clk);
1599+
1600+
clk_unprepare(i2c_imx->clk);
15991601

16001602
pm_runtime_put_noidle(&pdev->dev);
16011603
pm_runtime_disable(&pdev->dev);

drivers/i2c/busses/i2c-scmi.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct acpi_smbus_cmi {
3030
u8 cap_info:1;
3131
u8 cap_read:1;
3232
u8 cap_write:1;
33-
const struct smbus_methods_t *methods;
33+
struct smbus_methods_t *methods;
3434
};
3535

3636
static const struct smbus_methods_t smbus_methods = {
@@ -361,21 +361,26 @@ static acpi_status acpi_smbus_cmi_query_methods(acpi_handle handle, u32 level,
361361
static int acpi_smbus_cmi_add(struct acpi_device *device)
362362
{
363363
struct acpi_smbus_cmi *smbus_cmi;
364+
const struct acpi_device_id *id;
364365
int ret;
365366

366367
smbus_cmi = kzalloc(sizeof(struct acpi_smbus_cmi), GFP_KERNEL);
367368
if (!smbus_cmi)
368369
return -ENOMEM;
369370

370371
smbus_cmi->handle = device->handle;
371-
smbus_cmi->methods = device_get_match_data(&device->dev);
372372
strcpy(acpi_device_name(device), ACPI_SMBUS_HC_DEVICE_NAME);
373373
strcpy(acpi_device_class(device), ACPI_SMBUS_HC_CLASS);
374374
device->driver_data = smbus_cmi;
375375
smbus_cmi->cap_info = 0;
376376
smbus_cmi->cap_read = 0;
377377
smbus_cmi->cap_write = 0;
378378

379+
for (id = acpi_smbus_cmi_ids; id->id[0]; id++)
380+
if (!strcmp(id->id, acpi_device_hid(device)))
381+
smbus_cmi->methods =
382+
(struct smbus_methods_t *) id->driver_data;
383+
379384
acpi_walk_namespace(ACPI_TYPE_METHOD, smbus_cmi->handle, 1,
380385
acpi_smbus_cmi_query_methods, NULL, smbus_cmi, NULL);
381386

0 commit comments

Comments
 (0)