Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31857e54 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab
Browse files

[media] s5k6aa: Convert to devm_gpio_request_one()



Use the devm_gpio_request_one() managed function to simplify cleanup
code paths.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 598d8d1e
Loading
Loading
Loading
Loading
+26 −47
Original line number Diff line number Diff line
@@ -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 @@ static int s5k6aa_probe(struct i2c_client *client,
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;
}