aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core-base.c
diff options
context:
space:
mode:
authorPhil Reid <preid@electromag.com.au>2017-11-02 10:40:24 +0800
committerWolfram Sang <wsa@the-dreams.de>2017-11-27 18:39:13 +0100
commit3991c5c80beaf7eb9bce61e0b2f8f449e351a38e (patch)
treea369d3cadbea51d09c544c62c5a6ca0413d60306 /drivers/i2c/i2c-core-base.c
parenti2c: use macro IS_ENABLED in header i2c.h (diff)
downloadlinux-dev-3991c5c80beaf7eb9bce61e0b2f8f449e351a38e.tar.xz
linux-dev-3991c5c80beaf7eb9bce61e0b2f8f449e351a38e.zip
i2c: Switch to using gpiod interface for gpio bus recovery
Currently the i2c gpio recovery code uses gpio integer interface instead of the gpiod. This change switch the core code to use the gpiod while still retaining compatibility with the gpio integer interface. This will allow individual driver to be updated and tested individual to switch to using the gpiod interface. Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Phil Reid <preid@electromag.com.au> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/i2c-core-base.c')
-rw-r--r--drivers/i2c/i2c-core-base.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 706164b4c5be..fdc6a9d1394e 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -134,17 +134,17 @@ static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env)
/* i2c bus recovery routines */
static int get_scl_gpio_value(struct i2c_adapter *adap)
{
- return gpio_get_value(adap->bus_recovery_info->scl_gpio);
+ return gpiod_get_value_cansleep(adap->bus_recovery_info->scl_gpiod);
}
static void set_scl_gpio_value(struct i2c_adapter *adap, int val)
{
- gpio_set_value(adap->bus_recovery_info->scl_gpio, val);
+ gpiod_set_value_cansleep(adap->bus_recovery_info->scl_gpiod, val);
}
static int get_sda_gpio_value(struct i2c_adapter *adap)
{
- return gpio_get_value(adap->bus_recovery_info->sda_gpio);
+ return gpiod_get_value_cansleep(adap->bus_recovery_info->sda_gpiod);
}
static int i2c_get_gpios_for_recovery(struct i2c_adapter *adap)
@@ -159,6 +159,7 @@ static int i2c_get_gpios_for_recovery(struct i2c_adapter *adap)
dev_warn(dev, "Can't get SCL gpio: %d\n", bri->scl_gpio);
return ret;
}
+ bri->scl_gpiod = gpio_to_desc(bri->scl_gpio);
if (bri->get_sda) {
if (gpio_request_one(bri->sda_gpio, GPIOF_IN, "i2c-sda")) {
@@ -167,6 +168,7 @@ static int i2c_get_gpios_for_recovery(struct i2c_adapter *adap)
bri->sda_gpio);
bri->get_sda = NULL;
}
+ bri->sda_gpiod = gpio_to_desc(bri->sda_gpio);
}
return ret;
@@ -176,10 +178,13 @@ static void i2c_put_gpios_for_recovery(struct i2c_adapter *adap)
{
struct i2c_bus_recovery_info *bri = adap->bus_recovery_info;
- if (bri->get_sda)
+ if (bri->get_sda) {
gpio_free(bri->sda_gpio);
+ bri->sda_gpiod = NULL;
+ }
gpio_free(bri->scl_gpio);
+ bri->scl_gpiod = NULL;
}
/*
@@ -277,6 +282,14 @@ static void i2c_init_recovery(struct i2c_adapter *adap)
goto err;
}
+ if (bri->scl_gpiod && bri->recover_bus == i2c_generic_scl_recovery) {
+ bri->get_scl = get_scl_gpio_value;
+ bri->set_scl = set_scl_gpio_value;
+ if (bri->sda_gpiod)
+ bri->get_sda = get_sda_gpio_value;
+ return;
+ }
+
/* Generic GPIO recovery */
if (bri->recover_bus == i2c_generic_gpio_recovery) {
if (!gpio_is_valid(bri->scl_gpio)) {