All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
To: Linux Media Mailing List <linux-media@vger.kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>,
	eric miao <eric.y.miao@gmail.com>,
	Robert Jarzmik <robert.jarzmik@free.fr>
Subject: [PATCH 1/5] soc-camera: add a free_bus method to struct soc_camera_link
Date: Wed, 15 Apr 2009 14:17:26 +0200 (CEST)	[thread overview]
Message-ID: <Pine.LNX.4.64.0904151358070.4729@axis700.grange> (raw)
In-Reply-To: <Pine.LNX.4.64.0904151356480.4729@axis700.grange>

Currently pcm990 camera bus-width management functions request a GPIO and never
free it again. With this approach the GPIO extender driver cannot be unloaded
once camera drivers have been loaded, also unloading theb i2c-pxa bus driver
produces errors, because the GPIO extender driver cannot unregister properly.
Another problem is, that if camera drivers are once loaded before the GPIO
extender driver, the platform code marks the GPIO unavailable and only a reboot
helps to recover. Adding an explicit free_bus method and using it in mt9m001
and mt9v022 drivers fixes these problems.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
---

Eric, need your ack for the arch/arm/mach-pxa part. Sascha's wouldn't hurt 
either:-)

 arch/arm/mach-pxa/pcm990-baseboard.c |   23 ++++++++++++++++-------
 drivers/media/video/mt9m001.c        |    3 +++
 drivers/media/video/mt9v022.c        |    3 +++
 include/media/soc_camera.h           |    1 +
 4 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c
index 6c12b5a..9ce1ef2 100644
--- a/arch/arm/mach-pxa/pcm990-baseboard.c
+++ b/arch/arm/mach-pxa/pcm990-baseboard.c
@@ -380,12 +380,12 @@ static struct pca953x_platform_data pca9536_data = {
 	.gpio_base	= NR_BUILTIN_GPIO,
 };
 
-static int gpio_bus_switch;
+static int gpio_bus_switch = -EINVAL;
 
 static int pcm990_camera_set_bus_param(struct soc_camera_link *link,
-		unsigned long flags)
+				       unsigned long flags)
 {
-	if (gpio_bus_switch <= 0) {
+	if (gpio_bus_switch < 0) {
 		if (flags == SOCAM_DATAWIDTH_10)
 			return 0;
 		else
@@ -404,25 +404,34 @@ static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link)
 {
 	int ret;
 
-	if (!gpio_bus_switch) {
+	if (gpio_bus_switch < 0) {
 		ret = gpio_request(NR_BUILTIN_GPIO, "camera");
 		if (!ret) {
 			gpio_bus_switch = NR_BUILTIN_GPIO;
 			gpio_direction_output(gpio_bus_switch, 0);
-		} else
-			gpio_bus_switch = -EINVAL;
+		}
 	}
 
-	if (gpio_bus_switch > 0)
+	if (gpio_bus_switch >= 0)
 		return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10;
 	else
 		return SOCAM_DATAWIDTH_10;
 }
 
+static void pcm990_camera_free_bus(struct soc_camera_link *link)
+{
+	if (gpio_bus_switch < 0)
+		return;
+
+	gpio_free(gpio_bus_switch);
+	gpio_bus_switch = -EINVAL;
+}
+
 static struct soc_camera_link iclink = {
 	.bus_id	= 0, /* Must match with the camera ID above */
 	.query_bus_param = pcm990_camera_query_bus_param,
 	.set_bus_param = pcm990_camera_set_bus_param,
+	.free_bus = pcm990_camera_free_bus,
 };
 
 /* Board I2C devices. */
diff --git a/drivers/media/video/mt9m001.c b/drivers/media/video/mt9m001.c
index 684f62f..3838ff7 100644
--- a/drivers/media/video/mt9m001.c
+++ b/drivers/media/video/mt9m001.c
@@ -604,10 +604,13 @@ ei2c:
 static void mt9m001_video_remove(struct soc_camera_device *icd)
 {
 	struct mt9m001 *mt9m001 = container_of(icd, struct mt9m001, icd);
+	struct soc_camera_link *icl = mt9m001->client->dev.platform_data;
 
 	dev_dbg(&icd->dev, "Video %x removed: %p, %p\n", mt9m001->client->addr,
 		icd->dev.parent, icd->vdev);
 	soc_camera_video_stop(icd);
+	if (icl->free_bus)
+		icl->free_bus(icl);
 }
 
 static int mt9m001_probe(struct i2c_client *client,
diff --git a/drivers/media/video/mt9v022.c b/drivers/media/video/mt9v022.c
index 4d3b481..412b399 100644
--- a/drivers/media/video/mt9v022.c
+++ b/drivers/media/video/mt9v022.c
@@ -735,10 +735,13 @@ ei2c:
 static void mt9v022_video_remove(struct soc_camera_device *icd)
 {
 	struct mt9v022 *mt9v022 = container_of(icd, struct mt9v022, icd);
+	struct soc_camera_link *icl = mt9v022->client->dev.platform_data;
 
 	dev_dbg(&icd->dev, "Video %x removed: %p, %p\n", mt9v022->client->addr,
 		icd->dev.parent, icd->vdev);
 	soc_camera_video_stop(icd);
+	if (icl->free_bus)
+		icl->free_bus(icl);
 }
 
 static int mt9v022_probe(struct i2c_client *client,
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
index 3701368..396c325 100644
--- a/include/media/soc_camera.h
+++ b/include/media/soc_camera.h
@@ -107,6 +107,7 @@ struct soc_camera_link {
 	 */
 	int (*set_bus_param)(struct soc_camera_link *, unsigned long flags);
 	unsigned long (*query_bus_param)(struct soc_camera_link *);
+	void (*free_bus)(struct soc_camera_link *);
 };
 
 static inline struct soc_camera_device *to_soc_camera_dev(struct device *dev)
-- 
1.5.4


  reply	other threads:[~2009-04-15 12:17 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-15 12:17 [PATCH 0/5] soc-camera: convert to platform device Guennadi Liakhovetski
2009-04-15 12:17 ` Guennadi Liakhovetski [this message]
2009-04-16  3:39   ` [PATCH 1/5] soc-camera: add a free_bus method to struct soc_camera_link Eric Miao
2009-04-15 12:17 ` [PATCH 2/5] soc-camera: host-driver cleanup Guennadi Liakhovetski
2009-04-15 20:36   ` Robert Jarzmik
2009-04-15 12:18 ` [PATCH 3/5] soc-camera: remove an extra device generation from struct soc_camera_host Guennadi Liakhovetski
2009-04-15 12:18 ` [PATCH 4/5] soc-camera: simplify register access routines in multiple sensor drivers Guennadi Liakhovetski
2009-04-15 20:36   ` Robert Jarzmik
2009-04-15 12:20 ` [PATCH 5/5] soc-camera: Convert to a platform driver Guennadi Liakhovetski
2009-04-15 20:36   ` Robert Jarzmik
2009-04-16  2:19   ` Dongsoo, Nathaniel Kim
2009-04-16  8:58     ` Guennadi Liakhovetski
2009-04-16 10:00       ` Dongsoo, Nathaniel Kim
2009-04-16 10:30         ` Guennadi Liakhovetski
2009-04-16 11:09           ` Dongsoo, Nathaniel Kim
2009-04-16 12:06             ` Guennadi Liakhovetski
2009-04-16 12:48               ` Dongsoo, Nathaniel Kim
2009-04-16 12:59                 ` Guennadi Liakhovetski
2009-04-16 14:44                   ` Dongsoo Kim
2009-04-16 14:56                     ` Guennadi Liakhovetski
2009-04-16 15:15                       ` Dongsoo Kim
2009-04-15 20:36 ` [PATCH 0/5] soc-camera: convert to platform device Robert Jarzmik
2009-04-16 17:49   ` Robert Jarzmik
2009-04-16 18:14     ` Guennadi Liakhovetski
2009-04-16 19:04       ` Robert Jarzmik
2009-04-17  7:29 ` Dongsoo, Nathaniel Kim
2009-04-17  7:48   ` Guennadi Liakhovetski
2009-04-17  7:50     ` Dongsoo, Nathaniel Kim
2009-04-17  7:40 ` Magnus Damm
2009-04-17  7:51   ` Guennadi Liakhovetski
2009-04-17 10:31     ` Magnus Damm
2009-04-17 10:43       ` Guennadi Liakhovetski
2009-04-20  7:14         ` Magnus Damm
2009-04-20  7:22           ` Guennadi Liakhovetski
2009-04-20  8:00             ` Magnus Damm
2009-04-20  8:14               ` Guennadi Liakhovetski
2009-04-20  8:54                 ` Magnus Damm
2009-04-20 13:50                   ` v4l2-subdev " Guennadi Liakhovetski
2009-04-20 14:04                     ` Mark Brown
2009-04-20 14:18                       ` Guennadi Liakhovetski
2009-04-20 14:18                         ` Guennadi Liakhovetski
2009-04-20 14:31                         ` Mark Brown
2009-04-20  0:12       ` Kuninori Morimoto
2009-04-20  7:03         ` Magnus Damm
2009-04-17 18:38   ` [PATCH 5/5 v2] soc-camera: Convert to a platform driver Guennadi Liakhovetski
2009-04-19 20:01     ` Robert Jarzmik
2009-04-20  9:45     ` Darius Augulis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0904151358070.4729@axis700.grange \
    --to=g.liakhovetski@gmx.de \
    --cc=eric.y.miao@gmail.com \
    --cc=linux-media@vger.kernel.org \
    --cc=robert.jarzmik@free.fr \
    --cc=s.hauer@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.