From e4cc4fcc7b85ec32f05343b02229492c06baba1a Mon Sep 17 00:00:00 2001 From: Erik Andr?n Date: Tue, 30 Dec 2008 15:27:17 -0300 Subject: V4L/DVB (11411): gspca - m5602: Rework v4l ctrl handling in all sensors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, all sensors allocated a part of a large ctrl vector. Define this vector separately for each sensor instead. Signed-off-by: Erik Andrén Signed-off-by: Mauro Carvalho Chehab --- drivers/media/video/gspca/m5602/m5602_bridge.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/media/video/gspca/m5602/m5602_bridge.h') diff --git a/drivers/media/video/gspca/m5602/m5602_bridge.h b/drivers/media/video/gspca/m5602/m5602_bridge.h index a3f3b7a0c7e7..9ff41006673b 100644 --- a/drivers/media/video/gspca/m5602/m5602_bridge.h +++ b/drivers/media/video/gspca/m5602/m5602_bridge.h @@ -116,7 +116,7 @@ struct sd { char *name; /* A pointer to the currently connected sensor */ - struct m5602_sensor *sensor; + const struct m5602_sensor *sensor; struct sd_desc *desc; -- cgit v1.2.3-59-g8ed1b From 71b755b08e9946592c5354fbe6373eff7660ccbd Mon Sep 17 00:00:00 2001 From: Erik Andr?n Date: Tue, 30 Dec 2008 17:18:23 -0300 Subject: V4L/DVB (11415): gspca - m5602: Remove an unused member in the sd struct. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove an unused sd struct member. Remove a redundant define while we're at it. Signed-off-by: Erik Andrén Signed-off-by: Mauro Carvalho Chehab --- drivers/media/video/gspca/m5602/m5602_bridge.h | 3 --- drivers/media/video/gspca/m5602/m5602_sensor.h | 3 --- 2 files changed, 6 deletions(-) (limited to 'drivers/media/video/gspca/m5602/m5602_bridge.h') diff --git a/drivers/media/video/gspca/m5602/m5602_bridge.h b/drivers/media/video/gspca/m5602/m5602_bridge.h index 9ff41006673b..de76a1613015 100644 --- a/drivers/media/video/gspca/m5602/m5602_bridge.h +++ b/drivers/media/video/gspca/m5602/m5602_bridge.h @@ -112,9 +112,6 @@ static const unsigned char sensor_urb_skeleton[] = { struct sd { struct gspca_dev gspca_dev; - /* The name of the m5602 camera */ - char *name; - /* A pointer to the currently connected sensor */ const struct m5602_sensor *sensor; diff --git a/drivers/media/video/gspca/m5602/m5602_sensor.h b/drivers/media/video/gspca/m5602/m5602_sensor.h index b3e82af65066..5c8fb7abae54 100644 --- a/drivers/media/video/gspca/m5602/m5602_sensor.h +++ b/drivers/media/video/gspca/m5602/m5602_sensor.h @@ -21,9 +21,6 @@ #include "m5602_bridge.h" -#define M5602_DEFAULT_FRAME_WIDTH 640 -#define M5602_DEFAULT_FRAME_HEIGHT 480 - /* Enumerates all supported sensors */ enum sensors { OV9650_SENSOR = 1, -- cgit v1.2.3-59-g8ed1b From d9c700d415f05760f0129f798223cb4ac6a46d4b Mon Sep 17 00:00:00 2001 From: Erik Andr?n Date: Sat, 3 Jan 2009 12:10:11 -0300 Subject: V4L/DVB (11423): gspca - m5602-ov9650: Add a disconnect hook, setup a ctrl cache ctrl. Reading and writing to a register doesn't always work reliably. Add a cache and ensure that it is deallocated properly upon module disconnect. Signed-off-by: Erik Andr?n Signed-off-by: Mauro Carvalho Chehab --- drivers/media/video/gspca/m5602/m5602_bridge.h | 3 ++ drivers/media/video/gspca/m5602/m5602_core.c | 13 +++++++- drivers/media/video/gspca/m5602/m5602_ov9650.c | 42 +++++++++++++++++++++----- drivers/media/video/gspca/m5602/m5602_ov9650.h | 2 ++ drivers/media/video/gspca/m5602/m5602_sensor.h | 3 ++ 5 files changed, 54 insertions(+), 9 deletions(-) (limited to 'drivers/media/video/gspca/m5602/m5602_bridge.h') diff --git a/drivers/media/video/gspca/m5602/m5602_bridge.h b/drivers/media/video/gspca/m5602/m5602_bridge.h index de76a1613015..8f1cea6fd3bf 100644 --- a/drivers/media/video/gspca/m5602/m5602_bridge.h +++ b/drivers/media/video/gspca/m5602/m5602_bridge.h @@ -117,6 +117,9 @@ struct sd { struct sd_desc *desc; + /* Sensor private data */ + void *sensor_priv; + /* The current frame's id, used to detect frame boundaries */ u8 frame_id; diff --git a/drivers/media/video/gspca/m5602/m5602_core.c b/drivers/media/video/gspca/m5602/m5602_core.c index 0d84a12d59f0..1aac2985fee6 100644 --- a/drivers/media/video/gspca/m5602/m5602_core.c +++ b/drivers/media/video/gspca/m5602/m5602_core.c @@ -362,6 +362,17 @@ static int m5602_probe(struct usb_interface *intf, THIS_MODULE); } +void m5602_disconnect(struct usb_interface *intf) +{ + struct gspca_dev *gspca_dev = usb_get_intfdata(intf); + struct sd *sd = (struct sd *) gspca_dev; + + if (sd->sensor->disconnect) + sd->sensor->disconnect(sd); + + gspca_disconnect(intf); +} + static struct usb_driver sd_driver = { .name = MODULE_NAME, .id_table = m5602_table, @@ -370,7 +381,7 @@ static struct usb_driver sd_driver = { .suspend = gspca_suspend, .resume = gspca_resume, #endif - .disconnect = gspca_disconnect + .disconnect = m5602_disconnect }; /* -- module insert / remove -- */ diff --git a/drivers/media/video/gspca/m5602/m5602_ov9650.c b/drivers/media/video/gspca/m5602/m5602_ov9650.c index 15288a114fe2..39902652d24a 100644 --- a/drivers/media/video/gspca/m5602/m5602_ov9650.c +++ b/drivers/media/video/gspca/m5602/m5602_ov9650.c @@ -220,6 +220,7 @@ int ov9650_probe(struct sd *sd) { int err = 0; u8 prod_id = 0, ver_id = 0, i; + s32 *sensor_settings; if (force_sensor) { if (force_sensor == OV9650_SENSOR) { @@ -238,9 +239,10 @@ int ov9650_probe(struct sd *sd) u8 data = preinit_ov9650[i][2]; if (preinit_ov9650[i][0] == SENSOR) err = m5602_write_sensor(sd, - preinit_ov9650[i][1], &data, 1); + preinit_ov9650[i][1], &data, 1); else - err = m5602_write_bridge(sd, preinit_ov9650[i][1], data); + err = m5602_write_bridge(sd, + preinit_ov9650[i][1], data); } if (err < 0) @@ -260,10 +262,21 @@ int ov9650_probe(struct sd *sd) return -ENODEV; sensor_found: + + sensor_settings = kmalloc( + ARRAY_SIZE(ov9650_ctrls) * sizeof(s32), GFP_KERNEL); + if (!sensor_settings) + return -ENOMEM; + sd->gspca_dev.cam.cam_mode = ov9650_modes; sd->gspca_dev.cam.nmodes = ARRAY_SIZE(ov9650_modes); sd->desc->ctrls = ov9650_ctrls; sd->desc->nctrls = ARRAY_SIZE(ov9650_ctrls); + + for (i = 0; i < ARRAY_SIZE(ov9650_ctrls); i++) + sensor_settings[i] = ov9650_ctrls[i].qctrl.default_value; + sd->sensor_priv = sensor_settings; + return 0; } @@ -324,7 +337,8 @@ int ov9650_start(struct sd *sd) if (err < 0) return err; - err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, ((ver_offs >> 8) & 0xff)); + err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, + ((ver_offs >> 8) & 0xff)); if (err < 0) return err; @@ -344,13 +358,13 @@ int ov9650_start(struct sd *sd) if (err < 0) return err; - for (i = 0; i < 2 && !err; i++) { + for (i = 0; i < 2 && !err; i++) err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0); - } if (err < 0) return err; - err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, (hor_offs >> 8) & 0xff); + err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, + (hor_offs >> 8) & 0xff); if (err < 0) return err; @@ -358,11 +372,13 @@ int ov9650_start(struct sd *sd) if (err < 0) return err; - err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, ((width + hor_offs) >> 8) & 0xff); + err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, + ((width + hor_offs) >> 8) & 0xff); if (err < 0) return err; - err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, ((width + hor_offs) & 0xff)); + err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, + ((width + hor_offs) & 0xff)); if (err < 0) return err; @@ -431,6 +447,16 @@ int ov9650_power_down(struct sd *sd) return err; } +void ov9650_disconnect(struct sd *sd) +{ + ov9650_stop(sd); + ov9650_power_down(sd); + + sd->sensor = NULL; + + kfree(sd->sensor_priv); +} + int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val) { struct sd *sd = (struct sd *) gspca_dev; diff --git a/drivers/media/video/gspca/m5602/m5602_ov9650.h b/drivers/media/video/gspca/m5602/m5602_ov9650.h index eafe4216beef..1f27a857bf3f 100644 --- a/drivers/media/video/gspca/m5602/m5602_ov9650.h +++ b/drivers/media/video/gspca/m5602/m5602_ov9650.h @@ -138,6 +138,7 @@ int ov9650_init(struct sd *sd); int ov9650_start(struct sd *sd); int ov9650_stop(struct sd *sd); int ov9650_power_down(struct sd *sd); +void ov9650_disconnect(struct sd *sd); int ov9650_set_exposure(struct gspca_dev *gspca_dev, __s32 val); int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val); @@ -167,6 +168,7 @@ const static struct m5602_sensor ov9650 = { .start = ov9650_start, .stop = ov9650_stop, .power_down = ov9650_power_down, + .disconnect = ov9650_disconnect, }; static const unsigned char preinit_ov9650[][3] = diff --git a/drivers/media/video/gspca/m5602/m5602_sensor.h b/drivers/media/video/gspca/m5602/m5602_sensor.h index 5c8fb7abae54..0d3026936f2e 100644 --- a/drivers/media/video/gspca/m5602/m5602_sensor.h +++ b/drivers/media/video/gspca/m5602/m5602_sensor.h @@ -59,6 +59,9 @@ struct m5602_sensor { /* Executed when the camera ends to send data */ int (*stop)(struct sd *sd); + /* Executed when the device is disconnected */ + void (*disconnect)(struct sd *sd); + /* Performs a power down sequence */ int (*power_down)(struct sd *sd); }; -- cgit v1.2.3-59-g8ed1b