From 277144f8e4fd766dfb342503a2379241d33d5794 Mon Sep 17 00:00:00 2001 From: Devyn Liu Date: Thu, 28 Mar 2024 18:55:52 +0800 Subject: [PATCH 1/2] i2c: hisi: Add I2C controller reset and initialization proccess in bus recovery action driver inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I9KYFI CVE: NA ----------------------------------------------- The I2C controller hardware manual specifies the bus recovery operation for I2C. It is recommended to reset the I2C controller and reinitialize the I2C bus configuration in bus recovery operation, which can more effectively ensure the recovery of the I2C bus. So we add I2C controller reset and initialization proccess in bus recovery action. Signed-off-by: Devyn Liu Signed-off-by: Junhua Lu --- drivers/i2c/busses/i2c-hisi.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-hisi.c b/drivers/i2c/busses/i2c-hisi.c index aa4740d706ab..daf76bde3430 100644 --- a/drivers/i2c/busses/i2c-hisi.c +++ b/drivers/i2c/busses/i2c-hisi.c @@ -462,6 +462,26 @@ static void hisi_i2c_configure_bus(struct hisi_i2c_controller *ctlr) #ifdef CONFIG_ACPI #define HISI_I2C_PIN_MUX_METHOD "PMUX" +#define HISI_I2C_SOFT_RESET_METHOD "SRST" + +/** + * i2c_hisi_soft_reset - Do I2C master soft reset method through ACPI + * @dev: device need to be reset + * + * The function invokes the specific ACPI method "SRST" for trigger a soft + * reset of I2C controller in order to help on I2C controller recover from + * the abnormal state after bus recovery process. + */ +static void i2c_hisi_soft_reset(struct device *dev) +{ + acpi_handle handle = ACPI_HANDLE(dev); + acpi_status status; + unsigned long long data; + + status = acpi_evaluate_integer(handle, HISI_I2C_SOFT_RESET_METHOD, NULL, &data); + dev_info(dev, "I2C controller reset %s", ACPI_FAILURE(status) ? "failed" : + "succeed"); +} /** * i2c_dw_acpi_pin_mux_change - Change the I2C controller's pin mux through ACPI @@ -499,6 +519,13 @@ static void i2c_hisi_unprepare_recovery(struct i2c_adapter *adap) struct hisi_i2c_controller *ctlr = i2c_get_adapdata(adap); i2c_hisi_pin_mux_change(ctlr->dev, false); + i2c_hisi_soft_reset(ctlr->dev); + + /* + * After a soft reset, the device configuration return to default + * values and require reinitialization. + */ + hisi_i2c_configure_bus(ctlr); } static void hisi_i2c_init_recovery_info(struct hisi_i2c_controller *ctlr) @@ -510,7 +537,8 @@ static void hisi_i2c_init_recovery_info(struct hisi_i2c_controller *ctlr) if (acpi_disabled) return; - if (!adev || !acpi_has_method(adev->handle, HISI_I2C_PIN_MUX_METHOD)) + if (!adev || !acpi_has_method(adev->handle, HISI_I2C_PIN_MUX_METHOD) || + !acpi_has_method(adev->handle, HISI_I2C_SOFT_RESET_METHOD)) return; gpio = devm_gpiod_get_optional(ctlr->dev, "scl", GPIOD_OUT_HIGH); -- Gitee From c038d845b9e076771b26555413356ca9580d2c3d Mon Sep 17 00:00:00 2001 From: Devyn Liu Date: Sun, 28 Apr 2024 18:35:06 +0800 Subject: [PATCH 2/2] i2c: hisi: Correct the description comment for PIN_MUX METHOD driver inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I9KYFI CVE: NA ----------------------------------------------- Correct the description comment for PIN_MUX METHOD and rename it to hisi instead of dw. Signed-off-by: Devyn Liu Signed-off-by: Junhua Lu --- drivers/i2c/busses/i2c-hisi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-hisi.c b/drivers/i2c/busses/i2c-hisi.c index daf76bde3430..e7e8aa872711 100644 --- a/drivers/i2c/busses/i2c-hisi.c +++ b/drivers/i2c/busses/i2c-hisi.c @@ -484,7 +484,7 @@ static void i2c_hisi_soft_reset(struct device *dev) } /** - * i2c_dw_acpi_pin_mux_change - Change the I2C controller's pin mux through ACPI + * i2c_hisi_pin_mux_change - Change the I2C controller's pin mux through ACPI * @dev: device owns the SCL/SDA pin * @to_gpio: true to switch to GPIO, false to switch to SCL/SDA * -- Gitee