Lines Matching refs:gspca_dev
24 struct gspca_dev gspca_dev; /* !! must be the first item */ member
234 static void reg_r(struct gspca_dev *gspca_dev, in reg_r() argument
242 gspca_err(gspca_dev, "reg_r: buffer overflow\n"); in reg_r()
245 if (gspca_dev->usb_err < 0) in reg_r()
247 ret = usb_control_msg(gspca_dev->dev, in reg_r()
248 usb_rcvctrlpipe(gspca_dev->dev, 0), in reg_r()
253 len ? gspca_dev->usb_buf : NULL, len, in reg_r()
257 gspca_dev->usb_err = ret; in reg_r()
262 memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); in reg_r()
267 static void reg_w_1(struct gspca_dev *gspca_dev, in reg_w_1() argument
275 if (gspca_dev->usb_err < 0) in reg_w_1()
277 gspca_dev->usb_buf[0] = byte; in reg_w_1()
278 ret = usb_control_msg(gspca_dev->dev, in reg_w_1()
279 usb_sndctrlpipe(gspca_dev->dev, 0), in reg_w_1()
283 gspca_dev->usb_buf, 1, in reg_w_1()
287 gspca_dev->usb_err = ret; in reg_w_1()
292 static void reg_w_riv(struct gspca_dev *gspca_dev, in reg_w_riv() argument
295 struct usb_device *dev = gspca_dev->dev; in reg_w_riv()
298 if (gspca_dev->usb_err < 0) in reg_w_riv()
307 gspca_dev->usb_err = ret; in reg_w_riv()
310 gspca_dbg(gspca_dev, D_USBO, "reg_w_riv: 0x%02x,0x%04x:0x%04x\n", in reg_w_riv()
314 static void write_vector(struct gspca_dev *gspca_dev, in write_vector() argument
318 reg_w_riv(gspca_dev, data->req, data->idx, data->val); in write_vector()
323 static void setup_qtable(struct gspca_dev *gspca_dev, in setup_qtable() argument
330 reg_w_riv(gspca_dev, 0x00, 0x2800 + i, qtable[0][i]); in setup_qtable()
334 reg_w_riv(gspca_dev, 0x00, 0x2840 + i, qtable[1][i]); in setup_qtable()
337 static void spca504_acknowledged_command(struct gspca_dev *gspca_dev, in spca504_acknowledged_command() argument
340 reg_w_riv(gspca_dev, req, idx, val); in spca504_acknowledged_command()
341 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504_acknowledged_command()
342 gspca_dbg(gspca_dev, D_FRAM, "before wait 0x%04x\n", in spca504_acknowledged_command()
343 gspca_dev->usb_buf[0]); in spca504_acknowledged_command()
344 reg_w_riv(gspca_dev, req, idx, val); in spca504_acknowledged_command()
347 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504_acknowledged_command()
348 gspca_dbg(gspca_dev, D_FRAM, "after wait 0x%04x\n", in spca504_acknowledged_command()
349 gspca_dev->usb_buf[0]); in spca504_acknowledged_command()
352 static void spca504_read_info(struct gspca_dev *gspca_dev) in spca504_read_info() argument
361 reg_r(gspca_dev, 0, i, 1); in spca504_read_info()
362 info[i] = gspca_dev->usb_buf[0]; in spca504_read_info()
364 gspca_dbg(gspca_dev, D_STREAM, in spca504_read_info()
370 static void spca504A_acknowledged_command(struct gspca_dev *gspca_dev, in spca504A_acknowledged_command() argument
376 reg_w_riv(gspca_dev, req, idx, val); in spca504A_acknowledged_command()
377 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504A_acknowledged_command()
378 if (gspca_dev->usb_err < 0) in spca504A_acknowledged_command()
380 gspca_dbg(gspca_dev, D_FRAM, "Status 0x%02x Need 0x%02x\n", in spca504A_acknowledged_command()
381 gspca_dev->usb_buf[0], endcode); in spca504A_acknowledged_command()
389 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504A_acknowledged_command()
390 status = gspca_dev->usb_buf[0]; in spca504A_acknowledged_command()
392 gspca_dbg(gspca_dev, D_FRAM, "status 0x%04x after wait %d\n", in spca504A_acknowledged_command()
399 static void spca504B_PollingDataReady(struct gspca_dev *gspca_dev) in spca504B_PollingDataReady() argument
404 reg_r(gspca_dev, 0x21, 0, 1); in spca504B_PollingDataReady()
405 if ((gspca_dev->usb_buf[0] & 0x01) == 0) in spca504B_PollingDataReady()
411 static void spca504B_WaitCmdStatus(struct gspca_dev *gspca_dev) in spca504B_WaitCmdStatus() argument
416 reg_r(gspca_dev, 0x21, 1, 1); in spca504B_WaitCmdStatus()
417 if (gspca_dev->usb_buf[0] != 0) { in spca504B_WaitCmdStatus()
418 reg_w_1(gspca_dev, 0x21, 0, 1, 0); in spca504B_WaitCmdStatus()
419 reg_r(gspca_dev, 0x21, 1, 1); in spca504B_WaitCmdStatus()
420 spca504B_PollingDataReady(gspca_dev); in spca504B_WaitCmdStatus()
427 static void spca50x_GetFirmware(struct gspca_dev *gspca_dev) in spca50x_GetFirmware() argument
434 data = gspca_dev->usb_buf; in spca50x_GetFirmware()
435 reg_r(gspca_dev, 0x20, 0, 5); in spca50x_GetFirmware()
436 gspca_dbg(gspca_dev, D_STREAM, "FirmWare: %d %d %d %d %d\n", in spca50x_GetFirmware()
438 reg_r(gspca_dev, 0x23, 0, 64); in spca50x_GetFirmware()
439 reg_r(gspca_dev, 0x23, 1, 64); in spca50x_GetFirmware()
442 static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) in spca504B_SetSizeType() argument
444 struct sd *sd = (struct sd *) gspca_dev; in spca504B_SetSizeType()
447 Size = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; in spca504B_SetSizeType()
450 reg_w_riv(gspca_dev, 0x31, 0, 0); in spca504B_SetSizeType()
451 spca504B_WaitCmdStatus(gspca_dev); in spca504B_SetSizeType()
452 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
453 spca50x_GetFirmware(gspca_dev); in spca504B_SetSizeType()
455 reg_w_1(gspca_dev, 0x24, 0, 8, 2); /* type */ in spca504B_SetSizeType()
456 reg_r(gspca_dev, 0x24, 8, 1); in spca504B_SetSizeType()
458 reg_w_1(gspca_dev, 0x25, 0, 4, Size); in spca504B_SetSizeType()
459 reg_r(gspca_dev, 0x25, 4, 1); /* size */ in spca504B_SetSizeType()
460 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
463 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); in spca504B_SetSizeType()
464 spca504B_WaitCmdStatus(gspca_dev); in spca504B_SetSizeType()
465 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
470 reg_w_1(gspca_dev, 0x25, 0, 4, Size); in spca504B_SetSizeType()
471 reg_r(gspca_dev, 0x25, 4, 1); /* size */ in spca504B_SetSizeType()
472 reg_w_1(gspca_dev, 0x27, 0, 0, 6); in spca504B_SetSizeType()
473 reg_r(gspca_dev, 0x27, 0, 1); /* type */ in spca504B_SetSizeType()
474 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
480 spca504A_acknowledged_command(gspca_dev, in spca504B_SetSizeType()
483 spca504A_acknowledged_command(gspca_dev, in spca504B_SetSizeType()
486 spca504_acknowledged_command(gspca_dev, 0x08, Size, 0); in spca504B_SetSizeType()
491 reg_w_riv(gspca_dev, 0xa0, (0x0500 | (Size & 0x0f)), 0x00); in spca504B_SetSizeType()
492 reg_w_riv(gspca_dev, 0x20, 0x01, 0x0500 | (Size & 0x0f)); in spca504B_SetSizeType()
497 static void spca504_wait_status(struct gspca_dev *gspca_dev) in spca504_wait_status() argument
504 reg_r(gspca_dev, 0x06, 0x00, 1); in spca504_wait_status()
505 if (gspca_dev->usb_buf[0] == 0) in spca504_wait_status()
511 static void spca504B_setQtable(struct gspca_dev *gspca_dev) in spca504B_setQtable() argument
513 reg_w_1(gspca_dev, 0x26, 0, 0, 3); in spca504B_setQtable()
514 reg_r(gspca_dev, 0x26, 0, 1); in spca504B_setQtable()
515 spca504B_PollingDataReady(gspca_dev); in spca504B_setQtable()
518 static void setbrightness(struct gspca_dev *gspca_dev, s32 val) in setbrightness() argument
520 struct sd *sd = (struct sd *) gspca_dev; in setbrightness()
524 reg_w_riv(gspca_dev, 0x00, reg, val); in setbrightness()
527 static void setcontrast(struct gspca_dev *gspca_dev, s32 val) in setcontrast() argument
529 struct sd *sd = (struct sd *) gspca_dev; in setcontrast()
533 reg_w_riv(gspca_dev, 0x00, reg, val); in setcontrast()
536 static void setcolors(struct gspca_dev *gspca_dev, s32 val) in setcolors() argument
538 struct sd *sd = (struct sd *) gspca_dev; in setcolors()
542 reg_w_riv(gspca_dev, 0x00, reg, val); in setcolors()
545 static void init_ctl_reg(struct gspca_dev *gspca_dev) in init_ctl_reg() argument
547 struct sd *sd = (struct sd *) gspca_dev; in init_ctl_reg()
558 reg_w_riv(gspca_dev, 0, 0x21ad, 0x00); /* hue */ in init_ctl_reg()
559 reg_w_riv(gspca_dev, 0, 0x21ac, 0x01); /* sat/hue */ in init_ctl_reg()
560 reg_w_riv(gspca_dev, 0, 0x21a3, 0x00); /* gamma */ in init_ctl_reg()
563 reg_w_riv(gspca_dev, 0, 0x20f5, 0x40); in init_ctl_reg()
564 reg_w_riv(gspca_dev, 0, 0x20f4, 0x01); in init_ctl_reg()
565 reg_w_riv(gspca_dev, 0, 0x2089, 0x00); in init_ctl_reg()
569 spca504B_PollingDataReady(gspca_dev); in init_ctl_reg()
573 static int sd_config(struct gspca_dev *gspca_dev, in sd_config() argument
576 struct sd *sd = (struct sd *) gspca_dev; in sd_config()
579 cam = &gspca_dev->cam; in sd_config()
588 reg_r(gspca_dev, 0x20, 0, 1); in sd_config()
589 switch (gspca_dev->usb_buf[0]) { in sd_config()
625 static int sd_init(struct gspca_dev *gspca_dev) in sd_init() argument
627 struct sd *sd = (struct sd *) gspca_dev; in sd_init()
631 reg_w_riv(gspca_dev, 0x1d, 0x00, 0); in sd_init()
632 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x01); in sd_init()
633 reg_w_riv(gspca_dev, 0x00, 0x0d04, 0x00); in sd_init()
634 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x00); in sd_init()
635 reg_w_riv(gspca_dev, 0x00, 0x2301, 0x13); in sd_init()
636 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x00); in sd_init()
639 spca504B_PollingDataReady(gspca_dev); in sd_init()
640 spca50x_GetFirmware(gspca_dev); in sd_init()
643 spca50x_GetFirmware(gspca_dev); in sd_init()
644 reg_r(gspca_dev, 0x00, 0x5002, 1); in sd_init()
645 reg_w_1(gspca_dev, 0x24, 0, 0, 0); in sd_init()
646 reg_r(gspca_dev, 0x24, 0, 1); in sd_init()
647 spca504B_PollingDataReady(gspca_dev); in sd_init()
648 reg_w_riv(gspca_dev, 0x34, 0, 0); in sd_init()
649 spca504B_WaitCmdStatus(gspca_dev); in sd_init()
652 gspca_dbg(gspca_dev, D_STREAM, "Opening SPCA504 (PC-CAM 600)\n"); in sd_init()
653 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0000); in sd_init()
654 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0001); /* reset */ in sd_init()
655 spca504_wait_status(gspca_dev); in sd_init()
657 write_vector(gspca_dev, in sd_init()
661 write_vector(gspca_dev, spca504_pccam600_open_data, in sd_init()
663 setup_qtable(gspca_dev, qtable_creative_pccam); in sd_init()
667 gspca_dbg(gspca_dev, D_STREAM, "Opening SPCA504\n"); in sd_init()
669 spca504_read_info(gspca_dev); in sd_init()
672 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
675 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
678 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
682 spca504A_acknowledged_command(gspca_dev, 0x08, in sd_init()
690 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05); in sd_init()
692 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05); in sd_init()
693 spca504A_acknowledged_command(gspca_dev, 0x01, in sd_init()
697 reg_w_riv(gspca_dev, 0, 0x2000, 0); in sd_init()
698 reg_w_riv(gspca_dev, 0, 0x2883, 1); in sd_init()
699 setup_qtable(gspca_dev, qtable_spca504_default); in sd_init()
702 return gspca_dev->usb_err; in sd_init()
705 static int sd_start(struct gspca_dev *gspca_dev) in sd_start() argument
707 struct sd *sd = (struct sd *) gspca_dev; in sd_start()
711 jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height, in sd_start()
712 gspca_dev->pixfmt.width, in sd_start()
717 spca504B_setQtable(gspca_dev); in sd_start()
718 spca504B_SetSizeType(gspca_dev); in sd_start()
728 reg_w_riv(gspca_dev, 0xf0, 0, 0); in sd_start()
729 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
730 reg_r(gspca_dev, 0xf0, 4, 0); in sd_start()
731 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
734 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); in sd_start()
735 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
736 spca504B_PollingDataReady(gspca_dev); in sd_start()
742 spca504_read_info(gspca_dev); in sd_start()
745 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
748 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
750 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
753 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); in sd_start()
754 spca504_read_info(gspca_dev); in sd_start()
755 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); in sd_start()
756 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); in sd_start()
758 spca504B_SetSizeType(gspca_dev); in sd_start()
759 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05); in sd_start()
761 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05); in sd_start()
765 write_vector(gspca_dev, in sd_start()
769 write_vector(gspca_dev, spca504_pccam600_init_data, in sd_start()
773 reg_w_riv(gspca_dev, 0x0c, 0x0000, enable); in sd_start()
775 reg_w_riv(gspca_dev, 0xb0, 0x0000, enable); in sd_start()
779 reg_w_riv(gspca_dev, 0x30, 0x0001, 800); /* ~ 20 fps */ in sd_start()
780 reg_w_riv(gspca_dev, 0x30, 0x0002, 1600); in sd_start()
781 spca504B_SetSizeType(gspca_dev); in sd_start()
784 init_ctl_reg(gspca_dev); in sd_start()
785 return gspca_dev->usb_err; in sd_start()
788 static void sd_stopN(struct gspca_dev *gspca_dev) in sd_stopN() argument
790 struct sd *sd = (struct sd *) gspca_dev; in sd_stopN()
797 reg_w_riv(gspca_dev, 0x31, 0, 0); in sd_stopN()
798 spca504B_WaitCmdStatus(gspca_dev); in sd_stopN()
799 spca504B_PollingDataReady(gspca_dev); in sd_stopN()
803 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x0000); in sd_stopN()
809 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_stopN()
811 spca504A_acknowledged_command(gspca_dev, 0x01, in sd_stopN()
814 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); in sd_stopN()
815 reg_w_riv(gspca_dev, 0x01, 0x000f, 0x0000); in sd_stopN()
821 static void sd_pkt_scan(struct gspca_dev *gspca_dev, in sd_pkt_scan() argument
825 struct sd *sd = (struct sd *) gspca_dev; in sd_pkt_scan()
891 gspca_frame_add(gspca_dev, LAST_PACKET, in sd_pkt_scan()
895 gspca_frame_add(gspca_dev, FIRST_PACKET, in sd_pkt_scan()
903 gspca_frame_add(gspca_dev, INTER_PACKET, in sd_pkt_scan()
912 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); in sd_pkt_scan()
917 struct gspca_dev *gspca_dev = in sd_s_ctrl() local
918 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); in sd_s_ctrl()
919 struct sd *sd = (struct sd *)gspca_dev; in sd_s_ctrl()
921 gspca_dev->usb_err = 0; in sd_s_ctrl()
923 if (!gspca_dev->streaming) in sd_s_ctrl()
928 setbrightness(gspca_dev, ctrl->val); in sd_s_ctrl()
931 setcontrast(gspca_dev, ctrl->val); in sd_s_ctrl()
934 setcolors(gspca_dev, ctrl->val); in sd_s_ctrl()
940 return gspca_dev->usb_err; in sd_s_ctrl()
947 static int sd_init_controls(struct gspca_dev *gspca_dev) in sd_init_controls() argument
949 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; in sd_init_controls()
951 gspca_dev->vdev.ctrl_handler = hdl; in sd_init_controls()