Lines Matching refs:gspca_dev
33 struct gspca_dev gspca_dev; /* !! must be the first item */ member
243 static void reg_r(struct gspca_dev *gspca_dev, in reg_r() argument
251 gspca_err(gspca_dev, "reg_r: buffer overflow\n"); in reg_r()
254 if (gspca_dev->usb_err < 0) in reg_r()
256 ret = usb_control_msg(gspca_dev->dev, in reg_r()
257 usb_rcvctrlpipe(gspca_dev->dev, 0), in reg_r()
262 len ? gspca_dev->usb_buf : NULL, len, in reg_r()
266 gspca_dev->usb_err = ret; in reg_r()
271 static void reg_w_1(struct gspca_dev *gspca_dev, in reg_w_1() argument
279 if (gspca_dev->usb_err < 0) in reg_w_1()
281 gspca_dev->usb_buf[0] = byte; in reg_w_1()
282 ret = usb_control_msg(gspca_dev->dev, in reg_w_1()
283 usb_sndctrlpipe(gspca_dev->dev, 0), in reg_w_1()
287 gspca_dev->usb_buf, 1, in reg_w_1()
291 gspca_dev->usb_err = ret; in reg_w_1()
296 static void reg_w_riv(struct gspca_dev *gspca_dev, in reg_w_riv() argument
299 struct usb_device *dev = gspca_dev->dev; in reg_w_riv()
302 if (gspca_dev->usb_err < 0) in reg_w_riv()
311 gspca_dev->usb_err = ret; in reg_w_riv()
314 gspca_dbg(gspca_dev, D_USBO, "reg_w_riv: 0x%02x,0x%04x:0x%04x\n", in reg_w_riv()
318 static void write_vector(struct gspca_dev *gspca_dev, in write_vector() argument
322 reg_w_riv(gspca_dev, data->req, data->idx, data->val); in write_vector()
327 static void setup_qtable(struct gspca_dev *gspca_dev, in setup_qtable() argument
334 reg_w_riv(gspca_dev, 0x00, 0x2800 + i, qtable[0][i]); in setup_qtable()
338 reg_w_riv(gspca_dev, 0x00, 0x2840 + i, qtable[1][i]); in setup_qtable()
341 static void spca504_acknowledged_command(struct gspca_dev *gspca_dev, in spca504_acknowledged_command() argument
344 reg_w_riv(gspca_dev, req, idx, val); in spca504_acknowledged_command()
345 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504_acknowledged_command()
346 gspca_dbg(gspca_dev, D_FRAM, "before wait 0x%04x\n", in spca504_acknowledged_command()
347 gspca_dev->usb_buf[0]); in spca504_acknowledged_command()
348 reg_w_riv(gspca_dev, req, idx, val); in spca504_acknowledged_command()
351 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504_acknowledged_command()
352 gspca_dbg(gspca_dev, D_FRAM, "after wait 0x%04x\n", in spca504_acknowledged_command()
353 gspca_dev->usb_buf[0]); in spca504_acknowledged_command()
356 static void spca504_read_info(struct gspca_dev *gspca_dev) in spca504_read_info() argument
365 reg_r(gspca_dev, 0, i, 1); in spca504_read_info()
366 info[i] = gspca_dev->usb_buf[0]; in spca504_read_info()
368 gspca_dbg(gspca_dev, D_STREAM, in spca504_read_info()
374 static void spca504A_acknowledged_command(struct gspca_dev *gspca_dev, in spca504A_acknowledged_command() argument
380 reg_w_riv(gspca_dev, req, idx, val); in spca504A_acknowledged_command()
381 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504A_acknowledged_command()
382 if (gspca_dev->usb_err < 0) in spca504A_acknowledged_command()
384 gspca_dbg(gspca_dev, D_FRAM, "Status 0x%02x Need 0x%02x\n", in spca504A_acknowledged_command()
385 gspca_dev->usb_buf[0], endcode); in spca504A_acknowledged_command()
393 reg_r(gspca_dev, 0x01, 0x0001, 1); in spca504A_acknowledged_command()
394 status = gspca_dev->usb_buf[0]; in spca504A_acknowledged_command()
396 gspca_dbg(gspca_dev, D_FRAM, "status 0x%04x after wait %d\n", in spca504A_acknowledged_command()
403 static void spca504B_PollingDataReady(struct gspca_dev *gspca_dev) in spca504B_PollingDataReady() argument
408 reg_r(gspca_dev, 0x21, 0, 1); in spca504B_PollingDataReady()
409 if ((gspca_dev->usb_buf[0] & 0x01) == 0) in spca504B_PollingDataReady()
415 static void spca504B_WaitCmdStatus(struct gspca_dev *gspca_dev) in spca504B_WaitCmdStatus() argument
420 reg_r(gspca_dev, 0x21, 1, 1); in spca504B_WaitCmdStatus()
421 if (gspca_dev->usb_buf[0] != 0) { in spca504B_WaitCmdStatus()
422 reg_w_1(gspca_dev, 0x21, 0, 1, 0); in spca504B_WaitCmdStatus()
423 reg_r(gspca_dev, 0x21, 1, 1); in spca504B_WaitCmdStatus()
424 spca504B_PollingDataReady(gspca_dev); in spca504B_WaitCmdStatus()
431 static void spca50x_GetFirmware(struct gspca_dev *gspca_dev) in spca50x_GetFirmware() argument
438 data = gspca_dev->usb_buf; in spca50x_GetFirmware()
439 reg_r(gspca_dev, 0x20, 0, 5); in spca50x_GetFirmware()
440 gspca_dbg(gspca_dev, D_STREAM, "FirmWare: %d %d %d %d %d\n", in spca50x_GetFirmware()
442 reg_r(gspca_dev, 0x23, 0, 64); in spca50x_GetFirmware()
443 reg_r(gspca_dev, 0x23, 1, 64); in spca50x_GetFirmware()
446 static void spca504B_SetSizeType(struct gspca_dev *gspca_dev) in spca504B_SetSizeType() argument
448 struct sd *sd = (struct sd *) gspca_dev; in spca504B_SetSizeType()
451 Size = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; in spca504B_SetSizeType()
454 reg_w_riv(gspca_dev, 0x31, 0, 0); in spca504B_SetSizeType()
455 spca504B_WaitCmdStatus(gspca_dev); in spca504B_SetSizeType()
456 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
457 spca50x_GetFirmware(gspca_dev); in spca504B_SetSizeType()
459 reg_w_1(gspca_dev, 0x24, 0, 8, 2); /* type */ in spca504B_SetSizeType()
460 reg_r(gspca_dev, 0x24, 8, 1); in spca504B_SetSizeType()
462 reg_w_1(gspca_dev, 0x25, 0, 4, Size); in spca504B_SetSizeType()
463 reg_r(gspca_dev, 0x25, 4, 1); /* size */ in spca504B_SetSizeType()
464 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
467 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); in spca504B_SetSizeType()
468 spca504B_WaitCmdStatus(gspca_dev); in spca504B_SetSizeType()
469 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
474 reg_w_1(gspca_dev, 0x25, 0, 4, Size); in spca504B_SetSizeType()
475 reg_r(gspca_dev, 0x25, 4, 1); /* size */ in spca504B_SetSizeType()
476 reg_w_1(gspca_dev, 0x27, 0, 0, 6); in spca504B_SetSizeType()
477 reg_r(gspca_dev, 0x27, 0, 1); /* type */ in spca504B_SetSizeType()
478 spca504B_PollingDataReady(gspca_dev); in spca504B_SetSizeType()
484 spca504A_acknowledged_command(gspca_dev, in spca504B_SetSizeType()
487 spca504A_acknowledged_command(gspca_dev, in spca504B_SetSizeType()
490 spca504_acknowledged_command(gspca_dev, 0x08, Size, 0); in spca504B_SetSizeType()
495 reg_w_riv(gspca_dev, 0xa0, (0x0500 | (Size & 0x0f)), 0x00); in spca504B_SetSizeType()
496 reg_w_riv(gspca_dev, 0x20, 0x01, 0x0500 | (Size & 0x0f)); in spca504B_SetSizeType()
501 static void spca504_wait_status(struct gspca_dev *gspca_dev) in spca504_wait_status() argument
508 reg_r(gspca_dev, 0x06, 0x00, 1); in spca504_wait_status()
509 if (gspca_dev->usb_buf[0] == 0) in spca504_wait_status()
515 static void spca504B_setQtable(struct gspca_dev *gspca_dev) in spca504B_setQtable() argument
517 reg_w_1(gspca_dev, 0x26, 0, 0, 3); in spca504B_setQtable()
518 reg_r(gspca_dev, 0x26, 0, 1); in spca504B_setQtable()
519 spca504B_PollingDataReady(gspca_dev); in spca504B_setQtable()
522 static void setbrightness(struct gspca_dev *gspca_dev, s32 val) in setbrightness() argument
524 struct sd *sd = (struct sd *) gspca_dev; in setbrightness()
528 reg_w_riv(gspca_dev, 0x00, reg, val); in setbrightness()
531 static void setcontrast(struct gspca_dev *gspca_dev, s32 val) in setcontrast() argument
533 struct sd *sd = (struct sd *) gspca_dev; in setcontrast()
537 reg_w_riv(gspca_dev, 0x00, reg, val); in setcontrast()
540 static void setcolors(struct gspca_dev *gspca_dev, s32 val) in setcolors() argument
542 struct sd *sd = (struct sd *) gspca_dev; in setcolors()
546 reg_w_riv(gspca_dev, 0x00, reg, val); in setcolors()
549 static void init_ctl_reg(struct gspca_dev *gspca_dev) in init_ctl_reg() argument
551 struct sd *sd = (struct sd *) gspca_dev; in init_ctl_reg()
562 reg_w_riv(gspca_dev, 0, 0x21ad, 0x00); /* hue */ in init_ctl_reg()
563 reg_w_riv(gspca_dev, 0, 0x21ac, 0x01); /* sat/hue */ in init_ctl_reg()
564 reg_w_riv(gspca_dev, 0, 0x21a3, 0x00); /* gamma */ in init_ctl_reg()
567 reg_w_riv(gspca_dev, 0, 0x20f5, 0x40); in init_ctl_reg()
568 reg_w_riv(gspca_dev, 0, 0x20f4, 0x01); in init_ctl_reg()
569 reg_w_riv(gspca_dev, 0, 0x2089, 0x00); in init_ctl_reg()
573 spca504B_PollingDataReady(gspca_dev); in init_ctl_reg()
577 static int sd_config(struct gspca_dev *gspca_dev, in sd_config() argument
580 struct sd *sd = (struct sd *) gspca_dev; in sd_config()
583 cam = &gspca_dev->cam; in sd_config()
592 reg_r(gspca_dev, 0x20, 0, 1); in sd_config()
593 switch (gspca_dev->usb_buf[0]) { in sd_config()
629 static int sd_init(struct gspca_dev *gspca_dev) in sd_init() argument
631 struct sd *sd = (struct sd *) gspca_dev; in sd_init()
635 reg_w_riv(gspca_dev, 0x1d, 0x00, 0); in sd_init()
636 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x01); in sd_init()
637 reg_w_riv(gspca_dev, 0x00, 0x0d04, 0x00); in sd_init()
638 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x00); in sd_init()
639 reg_w_riv(gspca_dev, 0x00, 0x2301, 0x13); in sd_init()
640 reg_w_riv(gspca_dev, 0x00, 0x2306, 0x00); in sd_init()
643 spca504B_PollingDataReady(gspca_dev); in sd_init()
644 spca50x_GetFirmware(gspca_dev); in sd_init()
647 spca50x_GetFirmware(gspca_dev); in sd_init()
648 reg_r(gspca_dev, 0x00, 0x5002, 1); in sd_init()
649 reg_w_1(gspca_dev, 0x24, 0, 0, 0); in sd_init()
650 reg_r(gspca_dev, 0x24, 0, 1); in sd_init()
651 spca504B_PollingDataReady(gspca_dev); in sd_init()
652 reg_w_riv(gspca_dev, 0x34, 0, 0); in sd_init()
653 spca504B_WaitCmdStatus(gspca_dev); in sd_init()
656 gspca_dbg(gspca_dev, D_STREAM, "Opening SPCA504 (PC-CAM 600)\n"); in sd_init()
657 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0000); in sd_init()
658 reg_w_riv(gspca_dev, 0xe0, 0x0000, 0x0001); /* reset */ in sd_init()
659 spca504_wait_status(gspca_dev); in sd_init()
661 write_vector(gspca_dev, in sd_init()
665 write_vector(gspca_dev, spca504_pccam600_open_data, in sd_init()
667 setup_qtable(gspca_dev, qtable_creative_pccam); in sd_init()
671 gspca_dbg(gspca_dev, D_STREAM, "Opening SPCA504\n"); in sd_init()
673 spca504_read_info(gspca_dev); in sd_init()
676 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
679 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
682 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_init()
686 spca504A_acknowledged_command(gspca_dev, 0x08, in sd_init()
694 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05); in sd_init()
696 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05); in sd_init()
697 spca504A_acknowledged_command(gspca_dev, 0x01, in sd_init()
701 reg_w_riv(gspca_dev, 0, 0x2000, 0); in sd_init()
702 reg_w_riv(gspca_dev, 0, 0x2883, 1); in sd_init()
703 setup_qtable(gspca_dev, qtable_spca504_default); in sd_init()
706 return gspca_dev->usb_err; in sd_init()
709 static int sd_start(struct gspca_dev *gspca_dev) in sd_start() argument
711 struct sd *sd = (struct sd *) gspca_dev; in sd_start()
715 jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height, in sd_start()
716 gspca_dev->pixfmt.width, in sd_start()
721 spca504B_setQtable(gspca_dev); in sd_start()
722 spca504B_SetSizeType(gspca_dev); in sd_start()
732 reg_w_riv(gspca_dev, 0xf0, 0, 0); in sd_start()
733 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
734 reg_r(gspca_dev, 0xf0, 4, 0); in sd_start()
735 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
738 reg_w_riv(gspca_dev, 0x31, 0x0004, 0x00); in sd_start()
739 spca504B_WaitCmdStatus(gspca_dev); in sd_start()
740 spca504B_PollingDataReady(gspca_dev); in sd_start()
746 spca504_read_info(gspca_dev); in sd_start()
749 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
752 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
754 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_start()
757 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); in sd_start()
758 spca504_read_info(gspca_dev); in sd_start()
759 spca504_acknowledged_command(gspca_dev, 0x24, 8, 3); in sd_start()
760 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); in sd_start()
762 spca504B_SetSizeType(gspca_dev); in sd_start()
763 reg_w_riv(gspca_dev, 0x00, 0x270c, 0x05); in sd_start()
765 reg_w_riv(gspca_dev, 0x00, 0x2310, 0x05); in sd_start()
769 write_vector(gspca_dev, in sd_start()
773 write_vector(gspca_dev, spca504_pccam600_init_data, in sd_start()
777 reg_w_riv(gspca_dev, 0x0c, 0x0000, enable); in sd_start()
779 reg_w_riv(gspca_dev, 0xb0, 0x0000, enable); in sd_start()
783 reg_w_riv(gspca_dev, 0x30, 0x0001, 800); /* ~ 20 fps */ in sd_start()
784 reg_w_riv(gspca_dev, 0x30, 0x0002, 1600); in sd_start()
785 spca504B_SetSizeType(gspca_dev); in sd_start()
788 init_ctl_reg(gspca_dev); in sd_start()
789 return gspca_dev->usb_err; in sd_start()
792 static void sd_stopN(struct gspca_dev *gspca_dev) in sd_stopN() argument
794 struct sd *sd = (struct sd *) gspca_dev; in sd_stopN()
801 reg_w_riv(gspca_dev, 0x31, 0, 0); in sd_stopN()
802 spca504B_WaitCmdStatus(gspca_dev); in sd_stopN()
803 spca504B_PollingDataReady(gspca_dev); in sd_stopN()
807 reg_w_riv(gspca_dev, 0x00, 0x2000, 0x0000); in sd_stopN()
813 spca504A_acknowledged_command(gspca_dev, 0x24, in sd_stopN()
815 spca504A_acknowledged_command(gspca_dev, 0x01, in sd_stopN()
818 spca504_acknowledged_command(gspca_dev, 0x24, 0, 0); in sd_stopN()
819 reg_w_riv(gspca_dev, 0x01, 0x000f, 0x0000); in sd_stopN()
825 static void sd_pkt_scan(struct gspca_dev *gspca_dev, in sd_pkt_scan() argument
829 struct sd *sd = (struct sd *) gspca_dev; in sd_pkt_scan()
895 gspca_frame_add(gspca_dev, LAST_PACKET, in sd_pkt_scan()
899 gspca_frame_add(gspca_dev, FIRST_PACKET, in sd_pkt_scan()
907 gspca_frame_add(gspca_dev, INTER_PACKET, in sd_pkt_scan()
916 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); in sd_pkt_scan()
921 struct gspca_dev *gspca_dev = in sd_s_ctrl() local
922 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); in sd_s_ctrl()
923 struct sd *sd = (struct sd *)gspca_dev; in sd_s_ctrl()
925 gspca_dev->usb_err = 0; in sd_s_ctrl()
927 if (!gspca_dev->streaming) in sd_s_ctrl()
932 setbrightness(gspca_dev, ctrl->val); in sd_s_ctrl()
935 setcontrast(gspca_dev, ctrl->val); in sd_s_ctrl()
938 setcolors(gspca_dev, ctrl->val); in sd_s_ctrl()
944 return gspca_dev->usb_err; in sd_s_ctrl()
951 static int sd_init_controls(struct gspca_dev *gspca_dev) in sd_init_controls() argument
953 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; in sd_init_controls()
955 gspca_dev->vdev.ctrl_handler = hdl; in sd_init_controls()