00001 00034 #include <linux/module.h> 00035 #include <linux/init.h> 00036 #include <linux/kernel.h> 00037 #include <linux/version.h> 00038 #include <linux/errno.h> 00039 #include <linux/slab.h> 00040 #include <linux/kref.h> 00041 00042 #include <linux/usb.h> 00043 #include <media/v4l2-common.h> 00044 00045 #include "stk11xx.h" 00046 #include "stk11xx-dev.h" 00047 00048 00062 int dev_stk11xx_initialize_device(struct usb_stk11xx *dev) 00063 { 00064 int ret; 00065 00066 switch (dev->webcam_model) { 00067 case SYNTEK_STK_M811: 00068 case SYNTEK_STK_A311: 00069 ret = dev_stka311_initialize_device(dev); 00070 break; 00071 00072 case SYNTEK_STK_A821: 00073 ret = dev_stka821_initialize_device(dev); 00074 break; 00075 00076 case SYNTEK_STK_6A31: 00077 ret = dev_stk6a31_initialize_device(dev); 00078 break; 00079 00080 case SYNTEK_STK_6A33: 00081 ret = dev_stk6a33_initialize_device(dev); 00082 break; 00083 00084 case SYNTEK_STK_6A51: 00085 ret = dev_stk6a51_initialize_device(dev); 00086 break; 00087 00088 case SYNTEK_STK_6A54: 00089 ret = dev_stk6a54_initialize_device(dev); 00090 break; 00091 00092 default: 00093 ret = -1; 00094 } 00095 00096 return ret; 00097 } 00098 00099 00110 int dev_stk11xx_init_camera(struct usb_stk11xx *dev) 00111 { 00112 int ret; 00113 00114 switch (dev->webcam_model) { 00115 case SYNTEK_STK_M811: 00116 case SYNTEK_STK_A311: 00117 ret = dev_stka311_init_camera(dev); 00118 break; 00119 00120 case SYNTEK_STK_A821: 00121 ret = dev_stka821_init_camera(dev); 00122 break; 00123 00124 case SYNTEK_STK_6A31: 00125 ret = dev_stk6a31_init_camera(dev); 00126 break; 00127 00128 case SYNTEK_STK_6A33: 00129 ret = dev_stk6a33_init_camera(dev); 00130 break; 00131 00132 case SYNTEK_STK_6A51: 00133 ret = dev_stk6a51_init_camera(dev); 00134 break; 00135 00136 case SYNTEK_STK_6A54: 00137 ret = dev_stk6a54_init_camera(dev); 00138 break; 00139 00140 default: 00141 ret = -1; 00142 } 00143 00144 return ret; 00145 } 00146 00147 00161 int dev_stk11xx_check_device(struct usb_stk11xx *dev, int nbr) 00162 { 00163 int i; 00164 int value; 00165 00166 for (i=0; i<nbr; i++) { 00167 usb_stk11xx_read_registry(dev, 0x201, &value); 00168 00169 if (value == 0x00) { 00170 } 00171 else if ((value == 0x14) || (value == 0x30) || (value == 0x70) || (value == 0x71)) { 00172 } 00173 else if (value == 0x01) { 00174 return 1; 00175 } 00176 else if ((value == 0x04) || (value == 0x05)) 00177 return 1; 00178 else if (value == 0x15) 00179 return 1; 00180 else { 00181 STK_ERROR("Check device return error (0x0201 = %02X) !\n", value); 00182 return -1; 00183 } 00184 } 00185 00186 return 0; 00187 } 00188 00189 00201 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *dev) 00202 { 00203 int value; 00204 00205 usb_stk11xx_read_registry(dev, 0x0001, &value); 00206 00207 if (value != 0x03) { 00208 STK_ERROR("Error : Register 0x0001 = %02X\n", value); 00209 } 00210 00211 return value; 00212 } 00213 00214 00224 int dev_stk11xx_camera_on(struct usb_stk11xx *dev) 00225 { 00226 int ret = -1; 00227 struct usb_device *udev = dev->udev; 00228 00229 ret = usb_set_interface(udev, 0, 5); 00230 00231 if (ret < 0) 00232 STK_ERROR("usb_set_interface failed !\n"); 00233 00234 return ret; 00235 } 00236 00237 00247 int dev_stk11xx_camera_off(struct usb_stk11xx *dev) 00248 { 00249 int ret = -1; 00250 struct usb_device *udev = dev->udev; 00251 00252 ret = usb_set_interface(udev, 0, 0); 00253 00254 if (ret < 0) 00255 STK_ERROR("usb_set_interface failed !\n"); 00256 00257 return 0; 00258 } 00259 00260 00270 int dev_stk11xx_camera_asleep(struct usb_stk11xx *dev) 00271 { 00272 int ret; 00273 00274 switch (dev->webcam_model) { 00275 case SYNTEK_STK_M811: 00276 case SYNTEK_STK_A311: 00277 ret = dev_stka311_camera_asleep(dev); 00278 break; 00279 00280 case SYNTEK_STK_A821: 00281 ret = dev_stka821_camera_asleep(dev); 00282 break; 00283 00284 case SYNTEK_STK_6A31: 00285 ret = dev_stk6a31_camera_asleep(dev); 00286 break; 00287 00288 case SYNTEK_STK_6A33: 00289 ret = dev_stk6a33_camera_asleep(dev); 00290 break; 00291 00292 case SYNTEK_STK_6A51: 00293 ret = dev_stk6a51_camera_asleep(dev); 00294 break; 00295 00296 case SYNTEK_STK_6A54: 00297 ret = dev_stk6a54_camera_asleep(dev); 00298 break; 00299 00300 default: 00301 ret = -1; 00302 } 00303 00304 return ret; 00305 } 00306 00307 00321 int dev_stk11xx_camera_settings(struct usb_stk11xx *dev) 00322 { 00323 int ret; 00324 00325 switch (dev->webcam_model) { 00326 case SYNTEK_STK_M811: 00327 case SYNTEK_STK_A311: 00328 ret = dev_stka311_camera_settings(dev); 00329 break; 00330 00331 case SYNTEK_STK_A821: 00332 ret = dev_stka821_camera_settings(dev); 00333 break; 00334 00335 case SYNTEK_STK_6A31: 00336 ret = dev_stk6a31_camera_settings(dev); 00337 break; 00338 00339 case SYNTEK_STK_6A33: 00340 ret = dev_stk6a33_camera_settings(dev); 00341 break; 00342 00343 case SYNTEK_STK_6A51: 00344 ret = dev_stk6a51_camera_settings(dev); 00345 break; 00346 00347 case SYNTEK_STK_6A54: 00348 ret = dev_stk6a54_camera_settings(dev); 00349 break; 00350 00351 default: 00352 ret = -1; 00353 } 00354 00355 return ret; 00356 } 00357 00358 00372 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *dev) 00373 { 00374 int ret; 00375 00376 switch (dev->webcam_model) { 00377 case SYNTEK_STK_M811: 00378 case SYNTEK_STK_A311: 00379 ret = dev_stka311_set_camera_quality(dev); 00380 break; 00381 00382 case SYNTEK_STK_A821: 00383 ret = dev_stka821_set_camera_quality(dev); 00384 break; 00385 00386 case SYNTEK_STK_6A31: 00387 ret = dev_stk6a31_set_camera_quality(dev); 00388 break; 00389 00390 case SYNTEK_STK_6A33: 00391 ret = dev_stk6a33_set_camera_quality(dev); 00392 break; 00393 00394 case SYNTEK_STK_6A51: 00395 ret = dev_stk6a51_set_camera_quality(dev); 00396 break; 00397 00398 case SYNTEK_STK_6A54: 00399 ret = dev_stk6a54_set_camera_quality(dev); 00400 break; 00401 00402 default: 00403 ret = -1; 00404 } 00405 00406 return ret; 00407 } 00408 00409 00420 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *dev) 00421 { 00422 int ret; 00423 00424 switch (dev->webcam_model) { 00425 case SYNTEK_STK_M811: 00426 case SYNTEK_STK_A311: 00427 ret = dev_stka311_set_camera_fps(dev); 00428 break; 00429 00430 case SYNTEK_STK_A821: 00431 ret = dev_stka821_set_camera_fps(dev); 00432 break; 00433 00434 case SYNTEK_STK_6A31: 00435 ret = dev_stk6a31_set_camera_fps(dev); 00436 break; 00437 00438 case SYNTEK_STK_6A33: 00439 ret = dev_stk6a33_set_camera_fps(dev); 00440 break; 00441 00442 case SYNTEK_STK_6A51: 00443 ret = dev_stk6a51_set_camera_fps(dev); 00444 break; 00445 00446 case SYNTEK_STK_6A54: 00447 ret = dev_stk6a54_set_camera_fps(dev); 00448 break; 00449 00450 default: 00451 ret = -1; 00452 } 00453 00454 return ret; 00455 } 00456 00457 00468 int dev_stk11xx_start_stream(struct usb_stk11xx *dev) 00469 { 00470 int ret; 00471 00472 switch (dev->webcam_model) { 00473 case SYNTEK_STK_M811: 00474 case SYNTEK_STK_A311: 00475 ret = dev_stka311_start_stream(dev); 00476 break; 00477 00478 case SYNTEK_STK_A821: 00479 ret = dev_stka821_start_stream(dev); 00480 break; 00481 00482 case SYNTEK_STK_6A31: 00483 ret = dev_stk6a31_start_stream(dev); 00484 break; 00485 00486 case SYNTEK_STK_6A33: 00487 ret = dev_stk6a33_start_stream(dev); 00488 break; 00489 00490 case SYNTEK_STK_6A51: 00491 ret = dev_stk6a51_start_stream(dev); 00492 break; 00493 00494 case SYNTEK_STK_6A54: 00495 ret = dev_stk6a54_start_stream(dev); 00496 break; 00497 00498 default: 00499 ret = -1; 00500 } 00501 00502 return ret; 00503 } 00504 00505 00515 int dev_stk11xx_reconf_camera(struct usb_stk11xx *dev) 00516 { 00517 int ret; 00518 00519 switch (dev->webcam_model) { 00520 case SYNTEK_STK_M811: 00521 case SYNTEK_STK_A311: 00522 ret = dev_stka311_reconf_camera(dev); 00523 break; 00524 00525 case SYNTEK_STK_A821: 00526 ret = dev_stka821_reconf_camera(dev); 00527 break; 00528 00529 case SYNTEK_STK_6A31: 00530 ret = dev_stk6a31_reconf_camera(dev); 00531 break; 00532 00533 case SYNTEK_STK_6A33: 00534 ret = dev_stk6a33_reconf_camera(dev); 00535 break; 00536 00537 case SYNTEK_STK_6A51: 00538 ret = dev_stk6a51_reconf_camera(dev); 00539 break; 00540 00541 case SYNTEK_STK_6A54: 00542 ret = dev_stk6a54_reconf_camera(dev); 00543 break; 00544 00545 default: 00546 ret = -1; 00547 } 00548 00549 return ret; 00550 } 00551 00552 00563 int dev_stk11xx_stop_stream(struct usb_stk11xx *dev) 00564 { 00565 int ret; 00566 00567 switch (dev->webcam_model) { 00568 case SYNTEK_STK_M811: 00569 case SYNTEK_STK_A311: 00570 ret = dev_stka311_stop_stream(dev); 00571 break; 00572 00573 case SYNTEK_STK_A821: 00574 ret = dev_stka821_stop_stream(dev); 00575 break; 00576 00577 case SYNTEK_STK_6A31: 00578 ret = dev_stk6a31_stop_stream(dev); 00579 break; 00580 00581 case SYNTEK_STK_6A33: 00582 ret = dev_stk6a33_stop_stream(dev); 00583 break; 00584 00585 case SYNTEK_STK_6A51: 00586 ret = dev_stk6a51_stop_stream(dev); 00587 break; 00588 00589 case SYNTEK_STK_6A54: 00590 ret = dev_stk6a54_stop_stream(dev); 00591 break; 00592 00593 default: 00594 ret = -1; 00595 } 00596 00597 return ret; 00598 } 00599