Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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()"

+18 -11
+11 -9
drivers/i2c/busses/i2c-imx.c
··· 1572 1572 struct imx_i2c_struct *i2c_imx = platform_get_drvdata(pdev); 1573 1573 int irq, ret; 1574 1574 1575 - ret = pm_runtime_resume_and_get(&pdev->dev); 1576 - if (ret < 0) 1577 - return ret; 1575 + ret = pm_runtime_get_sync(&pdev->dev); 1578 1576 1579 1577 hrtimer_cancel(&i2c_imx->slave_timer); 1580 1578 ··· 1583 1585 if (i2c_imx->dma) 1584 1586 i2c_imx_dma_free(i2c_imx); 1585 1587 1586 - /* setup chip registers to defaults */ 1587 - imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR); 1588 - imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR); 1589 - imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR); 1590 - imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR); 1588 + if (ret == 0) { 1589 + /* setup chip registers to defaults */ 1590 + imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR); 1591 + imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IFDR); 1592 + imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2CR); 1593 + imx_i2c_write_reg(0, i2c_imx, IMX_I2C_I2SR); 1594 + clk_disable(i2c_imx->clk); 1595 + } 1591 1596 1592 1597 clk_notifier_unregister(i2c_imx->clk, &i2c_imx->clk_change_nb); 1593 1598 irq = platform_get_irq(pdev, 0); 1594 1599 if (irq >= 0) 1595 1600 free_irq(irq, i2c_imx); 1596 - clk_disable_unprepare(i2c_imx->clk); 1601 + 1602 + clk_unprepare(i2c_imx->clk); 1597 1603 1598 1604 pm_runtime_put_noidle(&pdev->dev); 1599 1605 pm_runtime_disable(&pdev->dev);
+7 -2
drivers/i2c/busses/i2c-scmi.c
··· 30 30 u8 cap_info:1; 31 31 u8 cap_read:1; 32 32 u8 cap_write:1; 33 - const struct smbus_methods_t *methods; 33 + struct smbus_methods_t *methods; 34 34 }; 35 35 36 36 static const struct smbus_methods_t smbus_methods = { ··· 361 361 static int acpi_smbus_cmi_add(struct acpi_device *device) 362 362 { 363 363 struct acpi_smbus_cmi *smbus_cmi; 364 + const struct acpi_device_id *id; 364 365 int ret; 365 366 366 367 smbus_cmi = kzalloc(sizeof(struct acpi_smbus_cmi), GFP_KERNEL); ··· 369 368 return -ENOMEM; 370 369 371 370 smbus_cmi->handle = device->handle; 372 - smbus_cmi->methods = device_get_match_data(&device->dev); 373 371 strcpy(acpi_device_name(device), ACPI_SMBUS_HC_DEVICE_NAME); 374 372 strcpy(acpi_device_class(device), ACPI_SMBUS_HC_CLASS); 375 373 device->driver_data = smbus_cmi; 376 374 smbus_cmi->cap_info = 0; 377 375 smbus_cmi->cap_read = 0; 378 376 smbus_cmi->cap_write = 0; 377 + 378 + for (id = acpi_smbus_cmi_ids; id->id[0]; id++) 379 + if (!strcmp(id->id, acpi_device_hid(device))) 380 + smbus_cmi->methods = 381 + (struct smbus_methods_t *) id->driver_data; 379 382 380 383 acpi_walk_namespace(ACPI_TYPE_METHOD, smbus_cmi->handle, 1, 381 384 acpi_smbus_cmi_query_methods, NULL, smbus_cmi, NULL);