--- zzzz-none-000/linux-4.9.276/drivers/i2c/busses/i2c-gpio.c 2021-07-20 14:21:16.000000000 +0000 +++ falcon-5530-750/linux-4.9.276/drivers/i2c/busses/i2c-gpio.c 2023-04-05 08:19:01.000000000 +0000 @@ -44,7 +44,7 @@ { struct i2c_gpio_platform_data *pdata = data; - gpio_set_value(pdata->sda_pin, state); + gpio_set_value_cansleep(pdata->sda_pin, state); } /* Toggle SCL by changing the direction of the pin. */ @@ -68,21 +68,21 @@ { struct i2c_gpio_platform_data *pdata = data; - gpio_set_value(pdata->scl_pin, state); + gpio_set_value_cansleep(pdata->scl_pin, state); } static int i2c_gpio_getsda(void *data) { struct i2c_gpio_platform_data *pdata = data; - return gpio_get_value(pdata->sda_pin); + return gpio_get_value_cansleep(pdata->sda_pin); } static int i2c_gpio_getscl(void *data) { struct i2c_gpio_platform_data *pdata = data; - return gpio_get_value(pdata->scl_pin); + return gpio_get_value_cansleep(pdata->scl_pin); } static int of_i2c_gpio_get_pins(struct device_node *np, @@ -175,6 +175,9 @@ memcpy(pdata, dev_get_platdata(&pdev->dev), sizeof(*pdata)); } + if (gpiod_cansleep(gpio_to_desc(pdata->sda_pin)) || gpiod_cansleep(gpio_to_desc(pdata->scl_pin))) + dev_warn(&pdev->dev, "Slow GPIO pins might wreak havoc into I2C/SMBus bus timing"); + if (pdata->sda_is_open_drain) { gpio_direction_output(pdata->sda_pin, 1); bit_data->setsda = i2c_gpio_setsda_val;