diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-06-30 08:03:21 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:40:19 -0400 |
commit | e163609ef77f065dbf3936dcb8f5ffcf6d19b35c (patch) | |
tree | 6326d963d1bb49f6b193c9ca14c7db1e8132c034 /drivers/media/video/gspca | |
parent | 8bb58964bc139d5ff5285f84aa302977d221754d (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.c | 28 |
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 */ |
154 | static int sd_init(struct gspca_dev *gspca_dev) | 155 | static 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 | ||
168 | static int sd_start(struct gspca_dev *gspca_dev) | 176 | static int sd_start(struct gspca_dev *gspca_dev) |