Lines Matching refs:gspca_dev
111 struct gspca_dev gspca_dev; /* !! must be the first item */
975 static void reg_w(struct gspca_dev *gspca_dev, u8 index, u8 value)
977 struct usb_device *dev = gspca_dev->dev;
980 if (gspca_dev->usb_err < 0)
988 gspca_dev->usb_err = ret;
992 /* the returned value is in gspca_dev->usb_buf */
993 static void reg_r(struct gspca_dev *gspca_dev, u8 index)
995 struct usb_device *dev = gspca_dev->dev;
998 if (gspca_dev->usb_err < 0)
1003 0, index, gspca_dev->usb_buf, 1, 500);
1006 gspca_dev->usb_err = ret;
1010 static void reg_w_buf(struct gspca_dev *gspca_dev,
1014 reg_w(gspca_dev, p->reg, p->val);
1019 static int i2c_w(struct gspca_dev *gspca_dev, u8 index, u8 value)
1021 struct sd *sd = (struct sd *) gspca_dev;
1023 reg_w(gspca_dev, TP6800_R11_SIF_CONTROL, 0x00);
1024 reg_w(gspca_dev, TP6800_R19_SIF_ADDR_S2, index);
1025 reg_w(gspca_dev, TP6800_R13_SIF_TX_DATA, value);
1026 reg_w(gspca_dev, TP6800_R11_SIF_CONTROL, 0x01);
1030 reg_r(gspca_dev, TP6800_R11_SIF_CONTROL);
1031 if (gspca_dev->usb_buf[0] == 0)
1033 reg_w(gspca_dev, TP6800_R11_SIF_CONTROL, 0x00);
1037 static void i2c_w_buf(struct gspca_dev *gspca_dev,
1041 i2c_w(gspca_dev, p->reg, p->val);
1046 static int i2c_r(struct gspca_dev *gspca_dev, u8 index, int len)
1048 struct sd *sd = (struct sd *) gspca_dev;
1051 reg_w(gspca_dev, TP6800_R19_SIF_ADDR_S2, index);
1052 reg_w(gspca_dev, TP6800_R11_SIF_CONTROL, 0x02);
1054 reg_r(gspca_dev, TP6800_R14_SIF_RX_DATA);
1055 v = gspca_dev->usb_buf[0];
1059 reg_r(gspca_dev, TP6800_R1B_SIF_RX_DATA2);
1060 v |= (gspca_dev->usb_buf[0] << 8);
1062 reg_r(gspca_dev, TP6800_R11_SIF_CONTROL);
1063 if (gspca_dev->usb_buf[0] == 0)
1065 reg_w(gspca_dev, TP6800_R11_SIF_CONTROL, 0x00);
1069 static void bulk_w(struct gspca_dev *gspca_dev,
1074 struct usb_device *dev = gspca_dev->dev;
1077 if (gspca_dev->usb_err < 0)
1082 gspca_dev->usb_buf[0] = tag;
1083 memcpy(&gspca_dev->usb_buf[1], data, count);
1086 gspca_dev->usb_buf, count + 1,
1091 gspca_dev->usb_err = ret;
1101 static int probe_6810(struct gspca_dev *gspca_dev)
1106 reg_r(gspca_dev, TP6800_R18_GPIO_DATA);
1107 gpio = gspca_dev->usb_buf[0];
1108 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1109 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1110 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1111 reg_w(gspca_dev, TP6800_R10_SIF_TYPE, 0x04); /* i2c 16 bits */
1112 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x21); /* ov??? */
1113 reg_w(gspca_dev, TP6800_R1A_SIF_TX_DATA2, 0x00);
1114 if (i2c_w(gspca_dev, 0x00, 0x00) >= 0)
1117 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1118 reg_w(gspca_dev, TP6800_R10_SIF_TYPE, 0x00); /* i2c 8 bits */
1119 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x7f); /* (unknown i2c) */
1120 if (i2c_w(gspca_dev, 0x00, 0x00) >= 0)
1123 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1124 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1125 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1126 reg_w(gspca_dev, TP6800_R10_SIF_TYPE, 0x00); /* i2c 8 bits */
1127 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x11); /* tas??? / hv??? */
1128 ret = i2c_r(gspca_dev, 0x00, 1);
1132 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1133 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1134 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1135 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x6e); /* po??? */
1136 ret = i2c_r(gspca_dev, 0x00, 1);
1140 ret = i2c_r(gspca_dev, 0x01, 1);
1144 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1145 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1146 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1147 reg_w(gspca_dev, TP6800_R10_SIF_TYPE, 0x04); /* i2c 16 bits */
1148 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x5d); /* mi/mt??? */
1149 ret = i2c_r(gspca_dev, 0x00, 2);
1153 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1154 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1155 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1156 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x5c); /* mi/mt??? */
1157 ret = i2c_r(gspca_dev, 0x36, 2);
1161 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1162 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1163 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1164 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x61); /* (unknown i2c) */
1165 reg_w(gspca_dev, TP6800_R1A_SIF_TX_DATA2, 0x10);
1166 if (i2c_w(gspca_dev, 0xff, 0x00) >= 0)
1169 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1170 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio);
1171 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, gpio | 0x20);
1172 reg_w(gspca_dev, TP6800_R10_SIF_TYPE, 0x00); /* i2c 8 bits */
1173 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x20); /* cx0342 */
1174 ret = i2c_r(gspca_dev, 0x00, 1);
1180 static void cx0342_6810_init(struct gspca_dev *gspca_dev)
1232 reg_w_buf(gspca_dev, reg_init_1, ARRAY_SIZE(reg_init_1));
1233 reg_w_buf(gspca_dev, tp6810_cx_init_common,
1235 reg_w_buf(gspca_dev, reg_init_2, ARRAY_SIZE(reg_init_2));
1237 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x20); /* cx0342 I2C addr */
1238 i2c_w_buf(gspca_dev, sensor_init, ARRAY_SIZE(sensor_init));
1239 i2c_w_buf(gspca_dev, cx0342_timing_seq, ARRAY_SIZE(cx0342_timing_seq));
1242 static void soi763a_6810_init(struct gspca_dev *gspca_dev)
1387 reg_w_buf(gspca_dev, reg_init_1, ARRAY_SIZE(reg_init_1));
1388 reg_w_buf(gspca_dev, tp6810_ov_init_common,
1390 reg_w_buf(gspca_dev, reg_init_2, ARRAY_SIZE(reg_init_2));
1392 i2c_w(gspca_dev, 0x12, 0x80); /* sensor reset */
1394 i2c_w_buf(gspca_dev, sensor_init, ARRAY_SIZE(sensor_init));
1398 static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 gain,
1401 struct sd *sd = (struct sd *) gspca_dev;
1405 i2c_w(gspca_dev, CX0342_EXPO_LINE_L, expo);
1406 i2c_w(gspca_dev, CX0342_EXPO_LINE_H, expo >> 8);
1408 i2c_w(gspca_dev, CX0342_RAW_GBGAIN_H,
1410 i2c_w(gspca_dev, CX0342_RAW_GBGAIN_L, gain);
1412 i2c_w(gspca_dev, CX0342_RAW_GRGAIN_H,
1414 i2c_w(gspca_dev, CX0342_RAW_GRGAIN_L, gain);
1417 i2c_w(gspca_dev, CX0342_RAW_BGAIN_H,
1419 i2c_w(gspca_dev, CX0342_RAW_BGAIN_L, blue);
1421 i2c_w(gspca_dev, CX0342_RAW_RGAIN_H,
1423 i2c_w(gspca_dev, CX0342_RAW_RGAIN_L, red);
1425 i2c_w(gspca_dev, CX0342_SYS_CTRL_0,
1431 i2c_w(gspca_dev, 0x10, /* AEC_H (exposure time) */
1433 /* i2c_w(gspca_dev, 0x76, 0x02); * AEC_L ([1:0] */
1434 i2c_w(gspca_dev, 0x00, /* gain */
1439 static void set_dqt(struct gspca_dev *gspca_dev, u8 q)
1441 struct sd *sd = (struct sd *) gspca_dev;
1444 gspca_dbg(gspca_dev, D_STREAM, "q %d -> %d\n", sd->quality, q);
1456 static void setquality(struct gspca_dev *gspca_dev, s32 q)
1458 struct sd *sd = (struct sd *) gspca_dev;
1463 reg_w(gspca_dev, TP6800_R7A_BLK_THRLD, 0x00);
1464 reg_w(gspca_dev, TP6800_R79_QUALITY, 0x04);
1465 reg_w(gspca_dev, TP6800_R79_QUALITY, q);
1470 reg_w(gspca_dev, TP6800_R7A_BLK_THRLD, 0x19);
1490 static void setgamma(struct gspca_dev *gspca_dev, s32 gamma)
1492 struct sd *sd = (struct sd *) gspca_dev;
3813 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x00);
3815 reg_w(gspca_dev, 0x02, 0x28);
3817 bulk_w(gspca_dev, 0x00, gamma_tb[gamma][0], 1024);
3818 bulk_w(gspca_dev, 0x01, gamma_tb[gamma][1], 1024);
3819 bulk_w(gspca_dev, 0x02, gamma_tb[gamma][2], 1024);
3823 reg_w(gspca_dev, 0x02, 0x2b);
3824 reg_w(gspca_dev, 0x02, 0x28);
3826 reg_w(gspca_dev, TP6800_R55_GAMMA_R,
3828 reg_w(gspca_dev, 0x02, 0x2b);
3829 reg_w(gspca_dev, 0x02, 0x28);
3831 reg_w(gspca_dev, TP6800_R56_GAMMA_G,
3833 reg_w(gspca_dev, 0x02, 0x2b);
3834 reg_w(gspca_dev, 0x02, 0x28);
3836 reg_w(gspca_dev, TP6800_R57_GAMMA_B,
3838 reg_w(gspca_dev, 0x02, 0x28);
3840 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x03);
3844 static void setsharpness(struct gspca_dev *gspca_dev, s32 val)
3846 struct sd *sd = (struct sd *) gspca_dev;
3850 if (gspca_dev->pixfmt.width == 640)
3851 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
3854 reg_w(gspca_dev, TP6800_R5D_DEMOSAIC_CFG, val);
3857 reg_w(gspca_dev, 0x59, val);
3861 static void setautogain(struct gspca_dev *gspca_dev, s32 val)
3863 struct sd *sd = (struct sd *) gspca_dev;
3869 static void set_resolution(struct gspca_dev *gspca_dev)
3871 struct sd *sd = (struct sd *) gspca_dev;
3873 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x00);
3874 if (gspca_dev->pixfmt.width == 320) {
3875 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x06);
3877 i2c_w(gspca_dev, CX0342_AUTO_ADC_CALIB, 0x01);
3879 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x03);
3880 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x01); /* qvga */
3881 reg_w(gspca_dev, TP6800_R5D_DEMOSAIC_CFG, 0x0d);
3882 i2c_w(gspca_dev, CX0342_EXPO_LINE_L, 0x37);
3883 i2c_w(gspca_dev, CX0342_EXPO_LINE_H, 0x01);
3885 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x05);
3887 i2c_w(gspca_dev, CX0342_AUTO_ADC_CALIB, 0x01);
3889 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x03);
3890 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
3891 reg_w(gspca_dev, TP6800_R5D_DEMOSAIC_CFG, 0x09);
3892 i2c_w(gspca_dev, CX0342_EXPO_LINE_L, 0xcf);
3893 i2c_w(gspca_dev, CX0342_EXPO_LINE_H, 0x00);
3895 i2c_w(gspca_dev, CX0342_SYS_CTRL_0, 0x01);
3896 bulk_w(gspca_dev, 0x03, color_gain[SENSOR_CX0342],
3898 setgamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
3900 setquality(gspca_dev, v4l2_ctrl_g_ctrl(sd->jpegqual));
3904 static int get_fr_idx(struct gspca_dev *gspca_dev)
3906 struct sd *sd = (struct sd *) gspca_dev;
3918 && gspca_dev->pixfmt.width == 640)
3929 && gspca_dev->pixfmt.width == 640)
3936 static void setframerate(struct gspca_dev *gspca_dev, s32 val)
3938 struct sd *sd = (struct sd *) gspca_dev;
3941 fr_idx = get_fr_idx(gspca_dev);
3944 reg_r(gspca_dev, 0x7b);
3945 reg_w(gspca_dev, 0x7b,
3951 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, fr_idx);
3954 i2c_w(gspca_dev, CX0342_AUTO_ADC_CALIB, 0x01);
3957 static void setrgain(struct gspca_dev *gspca_dev, s32 rgain)
3959 i2c_w(gspca_dev, CX0342_RAW_RGAIN_H, rgain >> 8);
3960 i2c_w(gspca_dev, CX0342_RAW_RGAIN_L, rgain);
3961 i2c_w(gspca_dev, CX0342_SYS_CTRL_0, 0x80);
3964 static int sd_setgain(struct gspca_dev *gspca_dev)
3966 struct sd *sd = (struct sd *) gspca_dev;
3967 s32 val = gspca_dev->gain->val;
3970 s32 old = gspca_dev->gain->cur.val ?
3971 gspca_dev->gain->cur.val : 1;
3980 if (gspca_dev->streaming) {
3982 setexposure(gspca_dev, gspca_dev->exposure->val,
3983 gspca_dev->gain->val,
3986 setexposure(gspca_dev, gspca_dev->exposure->val,
3987 gspca_dev->gain->val, 0, 0);
3989 return gspca_dev->usb_err;
3992 static void setbgain(struct gspca_dev *gspca_dev, s32 bgain)
3994 i2c_w(gspca_dev, CX0342_RAW_BGAIN_H, bgain >> 8);
3995 i2c_w(gspca_dev, CX0342_RAW_BGAIN_L, bgain);
3996 i2c_w(gspca_dev, CX0342_SYS_CTRL_0, 0x80);
4000 static int sd_config(struct gspca_dev *gspca_dev,
4003 struct sd *sd = (struct sd *) gspca_dev;
4007 gspca_dev->cam.cam_mode = vga_mode;
4008 gspca_dev->cam.nmodes = ARRAY_SIZE(vga_mode);
4009 gspca_dev->cam.mode_framerates = sd->bridge == BRIDGE_TP6800 ?
4017 static int sd_init(struct gspca_dev *gspca_dev)
4019 struct sd *sd = (struct sd *) gspca_dev;
4037 reg_w_buf(gspca_dev, tp6800_preinit,
4040 reg_w_buf(gspca_dev, tp6810_preinit,
4043 reg_r(gspca_dev, TP6800_R18_GPIO_DATA);
4044 gspca_dbg(gspca_dev, D_PROBE, "gpio: %02x\n", gspca_dev->usb_buf[0]);
4058 switch (gspca_dev->usb_buf[0] & 0x07) {
4069 sensor = probe_6810(gspca_dev);
4081 soi763a_6810_init(gspca_dev);
4086 cx0342_6810_init(gspca_dev);
4090 set_dqt(gspca_dev, 0);
4095 static int sd_isoc_init(struct gspca_dev *gspca_dev)
4097 struct sd *sd = (struct sd *) gspca_dev;
4127 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x20);
4128 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x87);
4129 i2c_w_buf(gspca_dev, cx_sensor_init,
4131 reg_w_buf(gspca_dev, cx_bridge_init,
4133 bulk_w(gspca_dev, 0x03, color_null, sizeof color_null);
4134 reg_w(gspca_dev, 0x59, 0x40);
4136 reg_w(gspca_dev, TP6800_R12_SIF_ADDR_S, 0x21);
4137 i2c_w_buf(gspca_dev, ov_sensor_init,
4139 reg_r(gspca_dev, 0x7b);
4140 reg_w_buf(gspca_dev, ov_bridge_init,
4143 reg_w(gspca_dev, TP6800_R78_FORMAT,
4144 gspca_dev->curr_mode ? 0x00 : 0x01);
4145 return gspca_dev->usb_err;
4148 static void set_led(struct gspca_dev *gspca_dev, int on)
4152 reg_r(gspca_dev, TP6800_R18_GPIO_DATA);
4153 data = gspca_dev->usb_buf[0];
4158 reg_w(gspca_dev, TP6800_R18_GPIO_DATA, data);
4161 static void cx0342_6800_start(struct gspca_dev *gspca_dev)
4163 struct sd *sd = (struct sd *) gspca_dev;
4229 reg_w_buf(gspca_dev, reg_init, ARRAY_SIZE(reg_init));
4230 i2c_w_buf(gspca_dev, sensor_init, ARRAY_SIZE(sensor_init));
4231 i2c_w_buf(gspca_dev, cx0342_timing_seq, ARRAY_SIZE(cx0342_timing_seq));
4232 reg_w(gspca_dev, TP6800_R5C_EDGE_THRLD, 0x10);
4233 reg_w(gspca_dev, TP6800_R54_DARK_CFG, 0x00);
4234 i2c_w(gspca_dev, CX0342_EXPO_LINE_H, 0x00);
4235 i2c_w(gspca_dev, CX0342_SYS_CTRL_0, 0x01);
4237 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4238 v4l2_ctrl_g_ctrl(gspca_dev->gain),
4242 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4243 v4l2_ctrl_g_ctrl(gspca_dev->gain), 0, 0);
4244 set_led(gspca_dev, 1);
4245 set_resolution(gspca_dev);
4248 static void cx0342_6810_start(struct gspca_dev *gspca_dev)
4250 struct sd *sd = (struct sd *) gspca_dev;
4316 reg_w(gspca_dev, 0x22, gspca_dev->alt);
4317 i2c_w_buf(gspca_dev, sensor_init_2, ARRAY_SIZE(sensor_init_2));
4318 reg_w_buf(gspca_dev, bridge_init_2, ARRAY_SIZE(bridge_init_2));
4319 reg_w_buf(gspca_dev, tp6810_cx_init_common,
4321 reg_w_buf(gspca_dev, bridge_init_3, ARRAY_SIZE(bridge_init_3));
4322 if (gspca_dev->curr_mode) {
4323 reg_w(gspca_dev, 0x4a, 0x7f);
4324 reg_w(gspca_dev, 0x07, 0x05);
4325 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
4327 reg_w(gspca_dev, 0x4a, 0xff);
4328 reg_w(gspca_dev, 0x07, 0x85);
4329 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x01); /* qvga */
4331 setgamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
4332 reg_w_buf(gspca_dev, tp6810_bridge_start,
4334 setsharpness(gspca_dev, v4l2_ctrl_g_ctrl(sd->sharpness));
4335 bulk_w(gspca_dev, 0x03, color_gain[SENSOR_CX0342],
4337 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0x87);
4338 i2c_w_buf(gspca_dev, sensor_init_3, ARRAY_SIZE(sensor_init_3));
4339 reg_w_buf(gspca_dev, bridge_init_5, ARRAY_SIZE(bridge_init_5));
4340 i2c_w_buf(gspca_dev, sensor_init_4, ARRAY_SIZE(sensor_init_4));
4341 reg_w_buf(gspca_dev, bridge_init_5, ARRAY_SIZE(bridge_init_5));
4342 i2c_w_buf(gspca_dev, sensor_init_5, ARRAY_SIZE(sensor_init_5));
4344 set_led(gspca_dev, 1);
4345 /* setquality(gspca_dev, v4l2_ctrl_g_ctrl(sd->jpegqual)); */
4348 static void soi763a_6800_start(struct gspca_dev *gspca_dev)
4350 struct sd *sd = (struct sd *) gspca_dev;
4440 reg_w_buf(gspca_dev, reg_init, ARRAY_SIZE(reg_init));
4442 i2c_w(gspca_dev, 0x12, 0x80); /* sensor reset */
4445 i2c_w_buf(gspca_dev, sensor_init, ARRAY_SIZE(sensor_init));
4447 reg_w(gspca_dev, TP6800_R5C_EDGE_THRLD, 0x10);
4448 reg_w(gspca_dev, TP6800_R54_DARK_CFG, 0x00);
4450 setsharpness(gspca_dev, v4l2_ctrl_g_ctrl(sd->sharpness));
4452 bulk_w(gspca_dev, 0x03, color_gain[SENSOR_SOI763A],
4455 set_led(gspca_dev, 1);
4457 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4458 v4l2_ctrl_g_ctrl(gspca_dev->gain),
4462 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4463 v4l2_ctrl_g_ctrl(gspca_dev->gain), 0, 0);
4465 setquality(gspca_dev, v4l2_ctrl_g_ctrl(sd->jpegqual));
4466 setgamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
4469 static void soi763a_6810_start(struct gspca_dev *gspca_dev)
4471 struct sd *sd = (struct sd *) gspca_dev;
4492 reg_w(gspca_dev, 0x22, gspca_dev->alt);
4493 bulk_w(gspca_dev, 0x03, color_null, sizeof color_null);
4494 reg_w(gspca_dev, 0x59, 0x40);
4496 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4497 v4l2_ctrl_g_ctrl(gspca_dev->gain),
4501 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4502 v4l2_ctrl_g_ctrl(gspca_dev->gain), 0, 0);
4503 reg_w_buf(gspca_dev, bridge_init_2, ARRAY_SIZE(bridge_init_2));
4504 reg_w_buf(gspca_dev, tp6810_ov_init_common,
4506 reg_w_buf(gspca_dev, bridge_init_3, ARRAY_SIZE(bridge_init_3));
4507 if (gspca_dev->curr_mode) {
4508 reg_w(gspca_dev, 0x4a, 0x7f);
4509 reg_w(gspca_dev, 0x07, 0x05);
4510 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x00); /* vga */
4512 reg_w(gspca_dev, 0x4a, 0xff);
4513 reg_w(gspca_dev, 0x07, 0x85);
4514 reg_w(gspca_dev, TP6800_R78_FORMAT, 0x01); /* qvga */
4516 setgamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
4517 reg_w_buf(gspca_dev, tp6810_bridge_start,
4520 if (gspca_dev->curr_mode) {
4521 reg_w(gspca_dev, 0x4f, 0x00);
4522 reg_w(gspca_dev, 0x4e, 0x7c);
4525 reg_w(gspca_dev, 0x00, 0x00);
4527 setsharpness(gspca_dev, v4l2_ctrl_g_ctrl(sd->sharpness));
4528 bulk_w(gspca_dev, 0x03, color_gain[SENSOR_SOI763A],
4530 set_led(gspca_dev, 1);
4531 reg_w(gspca_dev, TP6800_R3F_FRAME_RATE, 0xf0);
4533 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4534 v4l2_ctrl_g_ctrl(gspca_dev->gain),
4538 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4539 v4l2_ctrl_g_ctrl(gspca_dev->gain), 0, 0);
4540 reg_w_buf(gspca_dev, bridge_init_6, ARRAY_SIZE(bridge_init_6));
4544 static int sd_start(struct gspca_dev *gspca_dev)
4546 struct sd *sd = (struct sd *) gspca_dev;
4548 jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
4549 gspca_dev->pixfmt.width);
4550 set_dqt(gspca_dev, sd->quality);
4553 cx0342_6800_start(gspca_dev);
4555 soi763a_6800_start(gspca_dev);
4558 cx0342_6810_start(gspca_dev);
4560 soi763a_6810_start(gspca_dev);
4561 reg_w_buf(gspca_dev, tp6810_late_start,
4563 reg_w(gspca_dev, 0x80, 0x03);
4564 reg_w(gspca_dev, 0x82, gspca_dev->curr_mode ? 0x0a : 0x0e);
4567 setexposure(gspca_dev,
4568 v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4569 v4l2_ctrl_g_ctrl(gspca_dev->gain),
4573 setexposure(gspca_dev,
4574 v4l2_ctrl_g_ctrl(gspca_dev->exposure),
4575 v4l2_ctrl_g_ctrl(gspca_dev->gain), 0, 0);
4577 setquality(gspca_dev,
4580 setautogain(gspca_dev,
4581 v4l2_ctrl_g_ctrl(gspca_dev->autogain));
4584 setframerate(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure));
4586 return gspca_dev->usb_err;
4589 static void sd_stopN(struct gspca_dev *gspca_dev)
4591 struct sd *sd = (struct sd *) gspca_dev;
4594 reg_w(gspca_dev, TP6800_R2F_TIMING_CFG, 0x03);
4595 set_led(gspca_dev, 0);
4596 reg_w(gspca_dev, TP6800_R21_ENDP_1_CTL, 0x00);
4599 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
4603 struct sd *sd = (struct sd *) gspca_dev;
4618 gspca_dbg(gspca_dev, D_FRAM, "bad frame\n");
4619 gspca_dev->last_packet_type = DISCARD_PACKET;
4626 gspca_dev->last_packet_type = DISCARD_PACKET;
4632 gspca_dev->last_packet_type = DISCARD_PACKET;
4636 set_dqt(gspca_dev, data[6] & 0x0f);
4637 gspca_frame_add(gspca_dev, FIRST_PACKET,
4639 gspca_frame_add(gspca_dev, INTER_PACKET,
4642 gspca_frame_add(gspca_dev, LAST_PACKET,
4645 gspca_frame_add(gspca_dev, INTER_PACKET,
4653 gspca_frame_add(gspca_dev, LAST_PACKET, data, 0);
4660 gspca_dev->last_packet_type = DISCARD_PACKET;
4664 set_dqt(gspca_dev, data[7]);
4665 gspca_frame_add(gspca_dev, FIRST_PACKET,
4667 gspca_frame_add(gspca_dev, INTER_PACKET,
4671 gspca_dev->last_packet_type = DISCARD_PACKET;
4675 gspca_frame_add(gspca_dev, INTER_PACKET,
4678 gspca_dev->last_packet_type = DISCARD_PACKET;
4683 static void sd_dq_callback(struct gspca_dev *gspca_dev)
4685 struct sd *sd = (struct sd *) gspca_dev;
4696 reg_w(gspca_dev, 0x7d, 0x00);
4699 reg_w(gspca_dev, 0x27, 0xb0);
4702 reg_w(gspca_dev, 0x0c, 0x01);
4705 ret = usb_bulk_msg(gspca_dev->dev,
4706 usb_rcvbulkpipe(gspca_dev->dev, 0x02),
4707 gspca_dev->usb_buf,
4718 reg_w(gspca_dev, 0x27, 0xd0);
4721 ret = usb_bulk_msg(gspca_dev->dev,
4722 usb_rcvbulkpipe(gspca_dev->dev, 0x02),
4723 gspca_dev->usb_buf,
4731 luma = ((gspca_dev->usb_buf[8] << 8) + gspca_dev->usb_buf[7] +
4732 (gspca_dev->usb_buf[11] << 8) + gspca_dev->usb_buf[10] +
4733 (gspca_dev->usb_buf[14] << 8) + gspca_dev->usb_buf[13] +
4734 (gspca_dev->usb_buf[17] << 8) + gspca_dev->usb_buf[16] +
4735 (gspca_dev->usb_buf[20] << 8) + gspca_dev->usb_buf[19] +
4736 (gspca_dev->usb_buf[23] << 8) + gspca_dev->usb_buf[22] +
4737 (gspca_dev->usb_buf[26] << 8) + gspca_dev->usb_buf[25] +
4738 (gspca_dev->usb_buf[29] << 8) + gspca_dev->usb_buf[28])
4740 if (gspca_dev->pixfmt.width == 640)
4742 reg_w(gspca_dev, 0x7d, 0x00);
4744 expo = v4l2_ctrl_g_ctrl(gspca_dev->exposure);
4745 ret = gspca_expo_autogain(gspca_dev, luma,
4752 int new_expo = v4l2_ctrl_g_ctrl(gspca_dev->exposure);
4756 setframerate(gspca_dev, new_expo);
4763 static void sd_get_streamparm(struct gspca_dev *gspca_dev,
4766 struct sd *sd = (struct sd *) gspca_dev;
4772 i = get_fr_idx(gspca_dev);
4785 static void sd_set_streamparm(struct gspca_dev *gspca_dev,
4788 struct sd *sd = (struct sd *) gspca_dev;
4798 if (gspca_dev->streaming)
4799 setframerate(gspca_dev, v4l2_ctrl_g_ctrl(gspca_dev->exposure));
4802 i = get_fr_idx(gspca_dev);
4811 static int sd_set_jcomp(struct gspca_dev *gspca_dev,
4814 struct sd *sd = (struct sd *) gspca_dev;
4822 static int sd_get_jcomp(struct gspca_dev *gspca_dev,
4825 struct sd *sd = (struct sd *) gspca_dev;
4838 struct gspca_dev *gspca_dev =
4839 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
4840 struct sd *sd = (struct sd *)gspca_dev;
4842 gspca_dev->usb_err = 0;
4844 if (!gspca_dev->streaming)
4849 setsharpness(gspca_dev, ctrl->val);
4852 setgamma(gspca_dev, ctrl->val);
4855 setbgain(gspca_dev, ctrl->val);
4858 setrgain(gspca_dev, ctrl->val);
4861 sd_setgain(gspca_dev);
4866 sd_setgain(gspca_dev);
4872 return gspca_dev->usb_err;
4879 static int sd_init_controls(struct gspca_dev *gspca_dev)
4881 struct sd *sd = (struct sd *)gspca_dev;
4882 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
4884 gspca_dev->vdev.ctrl_handler = hdl;
4886 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4895 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4898 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4907 gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
4918 if (gspca_dev->autogain)
4919 v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
4921 v4l2_ctrl_cluster(2, &gspca_dev->exposure);