|
@@ -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);
|
|
|
- return ret;
|
|
|
+ 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;
|
|
|
}
|
|
|
- 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);
|
|
|
- return ret;
|
|
|
+ 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;
|
|
|
}
|
|
|
- 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;
|
|
|
}
|