diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-gpio.c')
| -rw-r--r-- | drivers/i2c/busses/i2c-gpio.c | 29 | 
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c index bfa02c6c2dd..71a45b210a2 100644 --- a/drivers/i2c/busses/i2c-gpio.c +++ b/drivers/i2c/busses/i2c-gpio.c @@ -15,6 +15,7 @@  #include <linux/slab.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> +#include <linux/of.h>  #include <linux/of_gpio.h>  struct i2c_gpio_private_data { @@ -93,6 +94,9 @@ static int of_i2c_gpio_get_pins(struct device_node *np,  	*sda_pin = of_get_gpio(np, 0);  	*scl_pin = of_get_gpio(np, 1); +	if (*sda_pin == -EPROBE_DEFER || *scl_pin == -EPROBE_DEFER) +		return -EPROBE_DEFER; +  	if (!gpio_is_valid(*sda_pin) || !gpio_is_valid(*scl_pin)) {  		pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n",  		       np->full_name, *sda_pin, *scl_pin); @@ -143,24 +147,22 @@ static int i2c_gpio_probe(struct platform_device *pdev)  		scl_pin = pdata->scl_pin;  	} -	ret = gpio_request(sda_pin, "sda"); +	ret = devm_gpio_request(&pdev->dev, sda_pin, "sda");  	if (ret) {  		if (ret == -EINVAL)  			ret = -EPROBE_DEFER;	/* Try again later */ -		goto err_request_sda; +		return ret;  	} -	ret = gpio_request(scl_pin, "scl"); +	ret = devm_gpio_request(&pdev->dev, scl_pin, "scl");  	if (ret) {  		if (ret == -EINVAL)  			ret = -EPROBE_DEFER;	/* Try again later */ -		goto err_request_scl; +		return ret;  	}  	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); -	if (!priv) { -		ret = -ENOMEM; -		goto err_add_bus; -	} +	if (!priv) +		return -ENOMEM;  	adap = &priv->adap;  	bit_data = &priv->bit_data;  	pdata = &priv->pdata; @@ -221,7 +223,7 @@ static int i2c_gpio_probe(struct platform_device *pdev)  	adap->nr = pdev->id;  	ret = i2c_bit_add_numbered_bus(adap);  	if (ret) -		goto err_add_bus; +		return ret;  	platform_set_drvdata(pdev, priv); @@ -231,13 +233,6 @@ static int i2c_gpio_probe(struct platform_device *pdev)  		 ? ", no clock stretching" : "");  	return 0; - -err_add_bus: -	gpio_free(scl_pin); -err_request_scl: -	gpio_free(sda_pin); -err_request_sda: -	return ret;  }  static int i2c_gpio_remove(struct platform_device *pdev) @@ -251,8 +246,6 @@ static int i2c_gpio_remove(struct platform_device *pdev)  	pdata = &priv->pdata;  	i2c_del_adapter(adap); -	gpio_free(pdata->scl_pin); -	gpio_free(pdata->sda_pin);  	return 0;  }  | 
