mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 07:01:57 +00:00
[media] s5k6aa: Convert to devm_gpio_request_one()
Use the devm_gpio_request_one() managed function to simplify cleanup code paths. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
598d8d1e4c
commit
31857e54fa
@ -1491,58 +1491,41 @@ static const struct v4l2_subdev_ops s5k6aa_subdev_ops = {
|
||||
/*
|
||||
* GPIO setup
|
||||
*/
|
||||
static int s5k6aa_configure_gpio(int nr, int val, const char *name)
|
||||
{
|
||||
unsigned long flags = val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
|
||||
int ret;
|
||||
|
||||
if (!gpio_is_valid(nr))
|
||||
return 0;
|
||||
ret = gpio_request_one(nr, flags, name);
|
||||
if (!ret)
|
||||
gpio_export(nr, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void s5k6aa_free_gpios(struct s5k6aa *s5k6aa)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(s5k6aa->gpio); i++) {
|
||||
if (!gpio_is_valid(s5k6aa->gpio[i].gpio))
|
||||
continue;
|
||||
gpio_free(s5k6aa->gpio[i].gpio);
|
||||
s5k6aa->gpio[i].gpio = -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
|
||||
const struct s5k6aa_platform_data *pdata)
|
||||
{
|
||||
const struct s5k6aa_gpio *gpio = &pdata->gpio_stby;
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&s5k6aa->sd);
|
||||
const struct s5k6aa_gpio *gpio;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
s5k6aa->gpio[STBY].gpio = -EINVAL;
|
||||
s5k6aa->gpio[RST].gpio = -EINVAL;
|
||||
|
||||
ret = s5k6aa_configure_gpio(gpio->gpio, gpio->level, "S5K6AA_STBY");
|
||||
if (ret) {
|
||||
s5k6aa_free_gpios(s5k6aa);
|
||||
gpio = &pdata->gpio_stby;
|
||||
if (gpio_is_valid(gpio->gpio)) {
|
||||
flags = (gpio->level ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW)
|
||||
| GPIOF_EXPORT;
|
||||
ret = devm_gpio_request_one(&client->dev, gpio->gpio, flags,
|
||||
"S5K6AA_STBY");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
s5k6aa->gpio[STBY] = *gpio;
|
||||
if (gpio_is_valid(gpio->gpio))
|
||||
gpio_set_value(gpio->gpio, 0);
|
||||
}
|
||||
|
||||
gpio = &pdata->gpio_reset;
|
||||
ret = s5k6aa_configure_gpio(gpio->gpio, gpio->level, "S5K6AA_RST");
|
||||
if (ret) {
|
||||
s5k6aa_free_gpios(s5k6aa);
|
||||
if (gpio_is_valid(gpio->gpio)) {
|
||||
flags = (gpio->level ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW)
|
||||
| GPIOF_EXPORT;
|
||||
ret = devm_gpio_request_one(&client->dev, gpio->gpio, flags,
|
||||
"S5K6AA_RST");
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
s5k6aa->gpio[RST] = *gpio;
|
||||
if (gpio_is_valid(gpio->gpio))
|
||||
gpio_set_value(gpio->gpio, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1593,7 +1576,7 @@ static int s5k6aa_probe(struct i2c_client *client,
|
||||
|
||||
ret = s5k6aa_configure_gpios(s5k6aa, pdata);
|
||||
if (ret)
|
||||
goto out_err2;
|
||||
goto out_err;
|
||||
|
||||
for (i = 0; i < S5K6AA_NUM_SUPPLIES; i++)
|
||||
s5k6aa->supplies[i].supply = s5k6aa_supply_names[i];
|
||||
@ -1602,12 +1585,12 @@ static int s5k6aa_probe(struct i2c_client *client,
|
||||
s5k6aa->supplies);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "Failed to get regulators\n");
|
||||
goto out_err3;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
ret = s5k6aa_initialize_ctrls(s5k6aa);
|
||||
if (ret)
|
||||
goto out_err3;
|
||||
goto out_err;
|
||||
|
||||
s5k6aa_presets_data_init(s5k6aa);
|
||||
|
||||
@ -1618,9 +1601,7 @@ static int s5k6aa_probe(struct i2c_client *client,
|
||||
|
||||
return 0;
|
||||
|
||||
out_err3:
|
||||
s5k6aa_free_gpios(s5k6aa);
|
||||
out_err2:
|
||||
out_err:
|
||||
media_entity_cleanup(&s5k6aa->sd.entity);
|
||||
return ret;
|
||||
}
|
||||
@ -1628,12 +1609,10 @@ out_err2:
|
||||
static int s5k6aa_remove(struct i2c_client *client)
|
||||
{
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct s5k6aa *s5k6aa = to_s5k6aa(sd);
|
||||
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
v4l2_ctrl_handler_free(sd->ctrl_handler);
|
||||
media_entity_cleanup(&sd->entity);
|
||||
s5k6aa_free_gpios(s5k6aa);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user