summaryrefslogtreecommitdiff
path: root/patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch')
-rw-r--r--patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch163
1 files changed, 163 insertions, 0 deletions
diff --git a/patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch b/patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch
new file mode 100644
index 00000000000..23cec2b3d3b
--- /dev/null
+++ b/patches.tizen/0724-media-s5c73m3-Convert-to-devm_gpio_request_one.patch
@@ -0,0 +1,163 @@
+From 31fcd2ccf01fbc52a27d4c51bf7064e531fbb7a2 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Thu, 2 May 2013 08:29:43 -0300
+Subject: [PATCH 0724/1302] [media] s5c73m3: 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>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/media/i2c/s5c73m3/s5c73m3-core.c | 79 +++++++++++---------------------
+ 1 file changed, 28 insertions(+), 51 deletions(-)
+
+diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
+index 0339f20..45ca106 100644
+--- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c
++++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
+@@ -1520,59 +1520,40 @@ static const struct v4l2_subdev_ops oif_subdev_ops = {
+ .video = &s5c73m3_oif_video_ops,
+ };
+
+-static int s5c73m3_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 int s5c73m3_free_gpios(struct s5c73m3 *state)
+-{
+- int i;
+-
+- for (i = 0; i < ARRAY_SIZE(state->gpio); i++) {
+- if (!gpio_is_valid(state->gpio[i].gpio))
+- continue;
+- gpio_free(state->gpio[i].gpio);
+- state->gpio[i].gpio = -EINVAL;
+- }
+- return 0;
+-}
+-
+ static int s5c73m3_configure_gpios(struct s5c73m3 *state,
+ const struct s5c73m3_platform_data *pdata)
+ {
+- const struct s5c73m3_gpio *gpio = &pdata->gpio_stby;
++ struct device *dev = &state->i2c_client->dev;
++ const struct s5c73m3_gpio *gpio;
++ unsigned long flags;
+ int ret;
+
+ state->gpio[STBY].gpio = -EINVAL;
+ state->gpio[RST].gpio = -EINVAL;
+
+- ret = s5c73m3_configure_gpio(gpio->gpio, gpio->level, "S5C73M3_STBY");
+- if (ret) {
+- s5c73m3_free_gpios(state);
+- 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(dev, gpio->gpio, flags,
++ "S5C73M3_STBY");
++ if (ret < 0)
++ return ret;
++
++ state->gpio[STBY] = *gpio;
+ }
+- state->gpio[STBY] = *gpio;
+- if (gpio_is_valid(gpio->gpio))
+- gpio_set_value(gpio->gpio, 0);
+
+ gpio = &pdata->gpio_reset;
+- ret = s5c73m3_configure_gpio(gpio->gpio, gpio->level, "S5C73M3_RST");
+- if (ret) {
+- s5c73m3_free_gpios(state);
+- 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(dev, gpio->gpio, flags,
++ "S5C73M3_RST");
++ if (ret < 0)
++ return ret;
++
++ state->gpio[RST] = *gpio;
+ }
+- state->gpio[RST] = *gpio;
+- if (gpio_is_valid(gpio->gpio))
+- gpio_set_value(gpio->gpio, 0);
+
+ return 0;
+ }
+@@ -1635,10 +1616,11 @@ static int s5c73m3_probe(struct i2c_client *client,
+
+ state->mclk_frequency = pdata->mclk_frequency;
+ state->bus_type = pdata->bus_type;
++ state->i2c_client = client;
+
+ ret = s5c73m3_configure_gpios(state, pdata);
+ if (ret)
+- goto out_err1;
++ goto out_err;
+
+ for (i = 0; i < S5C73M3_MAX_SUPPLIES; i++)
+ state->supplies[i].supply = s5c73m3_supply_names[i];
+@@ -1647,12 +1629,12 @@ static int s5c73m3_probe(struct i2c_client *client,
+ state->supplies);
+ if (ret) {
+ dev_err(dev, "failed to get regulators\n");
+- goto out_err2;
++ goto out_err;
+ }
+
+ ret = s5c73m3_init_controls(state);
+ if (ret)
+- goto out_err2;
++ goto out_err;
+
+ state->sensor_pix_size[RES_ISP] = &s5c73m3_isp_resolutions[1];
+ state->sensor_pix_size[RES_JPEG] = &s5c73m3_jpeg_resolutions[1];
+@@ -1668,9 +1650,7 @@ static int s5c73m3_probe(struct i2c_client *client,
+
+ ret = s5c73m3_register_spi_driver(state);
+ if (ret < 0)
+- goto out_err2;
+-
+- state->i2c_client = client;
++ goto out_err;
+
+ /* Initialize data plane lengths for the interleaved image data. */
+ state->frame_desc.entry[0].length = 10 * SZ_1M;
+@@ -1679,9 +1659,7 @@ static int s5c73m3_probe(struct i2c_client *client,
+ v4l2_info(sd, "%s: completed succesfully\n", __func__);
+ return 0;
+
+-out_err2:
+- s5c73m3_free_gpios(state);
+-out_err1:
++out_err:
+ media_entity_cleanup(&sd->entity);
+ return ret;
+ }
+@@ -1701,7 +1679,6 @@ static int s5c73m3_remove(struct i2c_client *client)
+ media_entity_cleanup(&sensor_sd->entity);
+
+ s5c73m3_unregister_spi_driver(state);
+- s5c73m3_free_gpios(state);
+
+ return 0;
+ }
+--
+1.8.3.2
+