aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2012-06-30 08:03:21 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:40:19 -0400
commite163609ef77f065dbf3936dcb8f5ffcf6d19b35c (patch)
tree6326d963d1bb49f6b193c9ca14c7db1e8132c034 /drivers/media/video/gspca
parent8bb58964bc139d5ff5285f84aa302977d221754d (diff)
[media] gspca_konica: Fix init sequence
The konica needs a freaking large time (circa 6.5 seconds) to "boot", and does not want to be bothered while doing so, so sleep for 6 seconds, and then query its status register at 100ms intervals until it becomes ready. This removes the "reg_w err: -32" messages shown in dmesg whenever a konica cam gets initialized, and also fixes the camera not working when an app tries to use it directly after it has been plugged in and after a suspend/resume cycle. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r--drivers/media/video/gspca/konica.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/drivers/media/video/gspca/konica.c b/drivers/media/video/gspca/konica.c
index 46e1ae402767..bbf91e07e38b 100644
--- a/drivers/media/video/gspca/konica.c
+++ b/drivers/media/video/gspca/konica.c
@@ -103,7 +103,8 @@ static void reg_w(struct gspca_dev *gspca_dev, u16 value, u16 index)
103 0, 103 0,
104 1000); 104 1000);
105 if (ret < 0) { 105 if (ret < 0) {
106 pr_err("reg_w err %d\n", ret); 106 pr_err("reg_w err writing %02x to %02x: %d\n",
107 value, index, ret);
107 gspca_dev->usb_err = ret; 108 gspca_dev->usb_err = ret;
108 } 109 }
109} 110}
@@ -124,7 +125,7 @@ static void reg_r(struct gspca_dev *gspca_dev, u16 value, u16 index)
124 2, 125 2,
125 1000); 126 1000);
126 if (ret < 0) { 127 if (ret < 0) {
127 pr_err("reg_w err %d\n", ret); 128 pr_err("reg_r err %d\n", ret);
128 gspca_dev->usb_err = ret; 129 gspca_dev->usb_err = ret;
129 } 130 }
130} 131}
@@ -153,16 +154,23 @@ static int sd_config(struct gspca_dev *gspca_dev,
153/* this function is called at probe and resume time */ 154/* this function is called at probe and resume time */
154static int sd_init(struct gspca_dev *gspca_dev) 155static int sd_init(struct gspca_dev *gspca_dev)
155{ 156{
156 /* HDG not sure if these 2 reads are needed */ 157 int i;
157 reg_r(gspca_dev, 0, 0x10); 158
158 PDEBUG(D_PROBE, "Reg 0x10 reads: %02x %02x", 159 /*
159 gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]); 160 * The konica needs a freaking large time to "boot" (approx 6.5 sec.),
160 reg_r(gspca_dev, 0, 0x10); 161 * and does not want to be bothered while doing so :|
161 PDEBUG(D_PROBE, "Reg 0x10 reads: %02x %02x", 162 * Register 0x10 counts from 1 - 3, with 3 being "ready"
162 gspca_dev->usb_buf[0], gspca_dev->usb_buf[1]); 163 */
164 msleep(6000);
165 for (i = 0; i < 20; i++) {
166 reg_r(gspca_dev, 0, 0x10);
167 if (gspca_dev->usb_buf[0] == 3)
168 break;
169 msleep(100);
170 }
163 reg_w(gspca_dev, 0, 0x0d); 171 reg_w(gspca_dev, 0, 0x0d);
164 172
165 return 0; 173 return gspca_dev->usb_err;
166} 174}
167 175
168static int sd_start(struct gspca_dev *gspca_dev) 176static int sd_start(struct gspca_dev *gspca_dev)