stv06xx.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 2001 Jean-Fredric Clere, Nikolas Zimmermann, Georg Acher
  4. * Mark Cave-Ayland, Carlo E Prelz, Dick Streefland
  5. * Copyright (c) 2002, 2003 Tuukka Toivonen
  6. * Copyright (c) 2008 Erik Andrén
  7. *
  8. * P/N 861037: Sensor HDCS1000 ASIC STV0600
  9. * P/N 861050-0010: Sensor HDCS1000 ASIC STV0600
  10. * P/N 861050-0020: Sensor Photobit PB100 ASIC STV0600-1 - QuickCam Express
  11. * P/N 861055: Sensor ST VV6410 ASIC STV0610 - LEGO cam
  12. * P/N 861075-0040: Sensor HDCS1000 ASIC
  13. * P/N 961179-0700: Sensor ST VV6410 ASIC STV0602 - Dexxa WebCam USB
  14. * P/N 861040-0000: Sensor ST VV6410 ASIC STV0610 - QuickCam Web
  15. */
  16. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  17. #include <linux/input.h>
  18. #include "stv06xx_sensor.h"
  19. MODULE_AUTHOR("Erik Andrén");
  20. MODULE_DESCRIPTION("STV06XX USB Camera Driver");
  21. MODULE_LICENSE("GPL");
  22. static bool dump_bridge;
  23. static bool dump_sensor;
  24. int stv06xx_write_bridge(struct sd *sd, u16 address, u16 i2c_data)
  25. {
  26. int err;
  27. struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
  28. struct usb_device *udev = sd->gspca_dev.dev;
  29. __u8 *buf = sd->gspca_dev.usb_buf;
  30. u8 len = (i2c_data > 0xff) ? 2 : 1;
  31. buf[0] = i2c_data & 0xff;
  32. buf[1] = (i2c_data >> 8) & 0xff;
  33. err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  34. 0x04, 0x40, address, 0, buf, len,
  35. STV06XX_URB_MSG_TIMEOUT);
  36. gspca_dbg(gspca_dev, D_CONF, "Written 0x%x to address 0x%x, status: %d\n",
  37. i2c_data, address, err);
  38. return (err < 0) ? err : 0;
  39. }
  40. int stv06xx_read_bridge(struct sd *sd, u16 address, u8 *i2c_data)
  41. {
  42. int err;
  43. struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
  44. struct usb_device *udev = sd->gspca_dev.dev;
  45. __u8 *buf = sd->gspca_dev.usb_buf;
  46. err = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
  47. 0x04, 0xc0, address, 0, buf, 1,
  48. STV06XX_URB_MSG_TIMEOUT);
  49. *i2c_data = buf[0];
  50. gspca_dbg(gspca_dev, D_CONF, "Reading 0x%x from address 0x%x, status %d\n",
  51. *i2c_data, address, err);
  52. return (err < 0) ? err : 0;
  53. }
  54. /* Wraps the normal write sensor bytes / words functions for writing a
  55. single value */
  56. int stv06xx_write_sensor(struct sd *sd, u8 address, u16 value)
  57. {
  58. if (sd->sensor->i2c_len == 2) {
  59. u16 data[2] = { address, value };
  60. return stv06xx_write_sensor_words(sd, data, 1);
  61. } else {
  62. u8 data[2] = { address, value };
  63. return stv06xx_write_sensor_bytes(sd, data, 1);
  64. }
  65. }
  66. static int stv06xx_write_sensor_finish(struct sd *sd)
  67. {
  68. int err = 0;
  69. if (sd->bridge == BRIDGE_STV610) {
  70. struct usb_device *udev = sd->gspca_dev.dev;
  71. __u8 *buf = sd->gspca_dev.usb_buf;
  72. buf[0] = 0;
  73. err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  74. 0x04, 0x40, 0x1704, 0, buf, 1,
  75. STV06XX_URB_MSG_TIMEOUT);
  76. }
  77. return (err < 0) ? err : 0;
  78. }
  79. int stv06xx_write_sensor_bytes(struct sd *sd, const u8 *data, u8 len)
  80. {
  81. int err, i, j;
  82. struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
  83. struct usb_device *udev = sd->gspca_dev.dev;
  84. __u8 *buf = sd->gspca_dev.usb_buf;
  85. gspca_dbg(gspca_dev, D_CONF, "I2C: Command buffer contains %d entries\n",
  86. len);
  87. for (i = 0; i < len;) {
  88. /* Build the command buffer */
  89. memset(buf, 0, I2C_BUFFER_LENGTH);
  90. for (j = 0; j < I2C_MAX_BYTES && i < len; j++, i++) {
  91. buf[j] = data[2*i];
  92. buf[0x10 + j] = data[2*i+1];
  93. gspca_dbg(gspca_dev, D_CONF, "I2C: Writing 0x%02x to reg 0x%02x\n",
  94. data[2*i+1], data[2*i]);
  95. }
  96. buf[0x20] = sd->sensor->i2c_addr;
  97. buf[0x21] = j - 1; /* Number of commands to send - 1 */
  98. buf[0x22] = I2C_WRITE_CMD;
  99. err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  100. 0x04, 0x40, 0x0400, 0, buf,
  101. I2C_BUFFER_LENGTH,
  102. STV06XX_URB_MSG_TIMEOUT);
  103. if (err < 0)
  104. return err;
  105. }
  106. return stv06xx_write_sensor_finish(sd);
  107. }
  108. int stv06xx_write_sensor_words(struct sd *sd, const u16 *data, u8 len)
  109. {
  110. int err, i, j;
  111. struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
  112. struct usb_device *udev = sd->gspca_dev.dev;
  113. __u8 *buf = sd->gspca_dev.usb_buf;
  114. gspca_dbg(gspca_dev, D_CONF, "I2C: Command buffer contains %d entries\n",
  115. len);
  116. for (i = 0; i < len;) {
  117. /* Build the command buffer */
  118. memset(buf, 0, I2C_BUFFER_LENGTH);
  119. for (j = 0; j < I2C_MAX_WORDS && i < len; j++, i++) {
  120. buf[j] = data[2*i];
  121. buf[0x10 + j * 2] = data[2*i+1];
  122. buf[0x10 + j * 2 + 1] = data[2*i+1] >> 8;
  123. gspca_dbg(gspca_dev, D_CONF, "I2C: Writing 0x%04x to reg 0x%02x\n",
  124. data[2*i+1], data[2*i]);
  125. }
  126. buf[0x20] = sd->sensor->i2c_addr;
  127. buf[0x21] = j - 1; /* Number of commands to send - 1 */
  128. buf[0x22] = I2C_WRITE_CMD;
  129. err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  130. 0x04, 0x40, 0x0400, 0, buf,
  131. I2C_BUFFER_LENGTH,
  132. STV06XX_URB_MSG_TIMEOUT);
  133. if (err < 0)
  134. return err;
  135. }
  136. return stv06xx_write_sensor_finish(sd);
  137. }
  138. int stv06xx_read_sensor(struct sd *sd, const u8 address, u16 *value)
  139. {
  140. int err;
  141. struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
  142. struct usb_device *udev = sd->gspca_dev.dev;
  143. __u8 *buf = sd->gspca_dev.usb_buf;
  144. err = stv06xx_write_bridge(sd, STV_I2C_FLUSH, sd->sensor->i2c_flush);
  145. if (err < 0)
  146. return err;
  147. /* Clear mem */
  148. memset(buf, 0, I2C_BUFFER_LENGTH);
  149. buf[0] = address;
  150. buf[0x20] = sd->sensor->i2c_addr;
  151. buf[0x21] = 0;
  152. /* Read I2C register */
  153. buf[0x22] = I2C_READ_CMD;
  154. err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  155. 0x04, 0x40, 0x1400, 0, buf, I2C_BUFFER_LENGTH,
  156. STV06XX_URB_MSG_TIMEOUT);
  157. if (err < 0) {
  158. pr_err("I2C: Read error writing address: %d\n", err);
  159. return err;
  160. }
  161. err = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
  162. 0x04, 0xc0, 0x1410, 0, buf, sd->sensor->i2c_len,
  163. STV06XX_URB_MSG_TIMEOUT);
  164. if (sd->sensor->i2c_len == 2)
  165. *value = buf[0] | (buf[1] << 8);
  166. else
  167. *value = buf[0];
  168. gspca_dbg(gspca_dev, D_CONF, "I2C: Read 0x%x from address 0x%x, status: %d\n",
  169. *value, address, err);
  170. return (err < 0) ? err : 0;
  171. }
  172. /* Dumps all bridge registers */
  173. static void stv06xx_dump_bridge(struct sd *sd)
  174. {
  175. int i;
  176. u8 data, buf;
  177. pr_info("Dumping all stv06xx bridge registers\n");
  178. for (i = 0x1400; i < 0x160f; i++) {
  179. stv06xx_read_bridge(sd, i, &data);
  180. pr_info("Read 0x%x from address 0x%x\n", data, i);
  181. }
  182. pr_info("Testing stv06xx bridge registers for writability\n");
  183. for (i = 0x1400; i < 0x160f; i++) {
  184. stv06xx_read_bridge(sd, i, &data);
  185. buf = data;
  186. stv06xx_write_bridge(sd, i, 0xff);
  187. stv06xx_read_bridge(sd, i, &data);
  188. if (data == 0xff)
  189. pr_info("Register 0x%x is read/write\n", i);
  190. else if (data != buf)
  191. pr_info("Register 0x%x is read/write, but only partially\n",
  192. i);
  193. else
  194. pr_info("Register 0x%x is read-only\n", i);
  195. stv06xx_write_bridge(sd, i, buf);
  196. }
  197. }
  198. /* this function is called at probe and resume time */
  199. static int stv06xx_init(struct gspca_dev *gspca_dev)
  200. {
  201. struct sd *sd = (struct sd *) gspca_dev;
  202. int err;
  203. gspca_dbg(gspca_dev, D_PROBE, "Initializing camera\n");
  204. /* Let the usb init settle for a bit
  205. before performing the initialization */
  206. msleep(250);
  207. err = sd->sensor->init(sd);
  208. if (dump_sensor && sd->sensor->dump)
  209. sd->sensor->dump(sd);
  210. return (err < 0) ? err : 0;
  211. }
  212. /* this function is called at probe time */
  213. static int stv06xx_init_controls(struct gspca_dev *gspca_dev)
  214. {
  215. struct sd *sd = (struct sd *) gspca_dev;
  216. gspca_dbg(gspca_dev, D_PROBE, "Initializing controls\n");
  217. gspca_dev->vdev.ctrl_handler = &gspca_dev->ctrl_handler;
  218. return sd->sensor->init_controls(sd);
  219. }
  220. /* Start the camera */
  221. static int stv06xx_start(struct gspca_dev *gspca_dev)
  222. {
  223. struct sd *sd = (struct sd *) gspca_dev;
  224. struct usb_host_interface *alt;
  225. struct usb_interface *intf;
  226. int err, packet_size;
  227. intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
  228. alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
  229. if (!alt) {
  230. gspca_err(gspca_dev, "Couldn't get altsetting\n");
  231. return -EIO;
  232. }
  233. if (alt->desc.bNumEndpoints < 1)
  234. return -ENODEV;
  235. packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
  236. err = stv06xx_write_bridge(sd, STV_ISO_SIZE_L, packet_size);
  237. if (err < 0)
  238. return err;
  239. /* Prepare the sensor for start */
  240. err = sd->sensor->start(sd);
  241. if (err < 0)
  242. goto out;
  243. /* Start isochronous streaming */
  244. err = stv06xx_write_bridge(sd, STV_ISO_ENABLE, 1);
  245. out:
  246. if (err < 0)
  247. gspca_dbg(gspca_dev, D_STREAM, "Starting stream failed\n");
  248. else
  249. gspca_dbg(gspca_dev, D_STREAM, "Started streaming\n");
  250. return (err < 0) ? err : 0;
  251. }
  252. static int stv06xx_isoc_init(struct gspca_dev *gspca_dev)
  253. {
  254. struct usb_interface_cache *intfc;
  255. struct usb_host_interface *alt;
  256. struct sd *sd = (struct sd *) gspca_dev;
  257. intfc = gspca_dev->dev->actconfig->intf_cache[0];
  258. if (intfc->num_altsetting < 2)
  259. return -ENODEV;
  260. alt = &intfc->altsetting[1];
  261. if (alt->desc.bNumEndpoints < 1)
  262. return -ENODEV;
  263. /* Start isoc bandwidth "negotiation" at max isoc bandwidth */
  264. alt->endpoint[0].desc.wMaxPacketSize =
  265. cpu_to_le16(sd->sensor->max_packet_size[gspca_dev->curr_mode]);
  266. return 0;
  267. }
  268. static int stv06xx_isoc_nego(struct gspca_dev *gspca_dev)
  269. {
  270. int ret, packet_size, min_packet_size;
  271. struct usb_host_interface *alt;
  272. struct sd *sd = (struct sd *) gspca_dev;
  273. /*
  274. * Existence of altsetting and endpoint was verified in
  275. * stv06xx_isoc_init()
  276. */
  277. alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1];
  278. packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
  279. min_packet_size = sd->sensor->min_packet_size[gspca_dev->curr_mode];
  280. if (packet_size <= min_packet_size)
  281. return -EIO;
  282. packet_size -= 100;
  283. if (packet_size < min_packet_size)
  284. packet_size = min_packet_size;
  285. alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(packet_size);
  286. ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1);
  287. if (ret < 0)
  288. gspca_err(gspca_dev, "set alt 1 err %d\n", ret);
  289. return ret;
  290. }
  291. static void stv06xx_stopN(struct gspca_dev *gspca_dev)
  292. {
  293. int err;
  294. struct sd *sd = (struct sd *) gspca_dev;
  295. /* stop ISO-streaming */
  296. err = stv06xx_write_bridge(sd, STV_ISO_ENABLE, 0);
  297. if (err < 0)
  298. goto out;
  299. err = sd->sensor->stop(sd);
  300. out:
  301. if (err < 0)
  302. gspca_dbg(gspca_dev, D_STREAM, "Failed to stop stream\n");
  303. else
  304. gspca_dbg(gspca_dev, D_STREAM, "Stopped streaming\n");
  305. }
  306. /*
  307. * Analyse an USB packet of the data stream and store it appropriately.
  308. * Each packet contains an integral number of chunks. Each chunk has
  309. * 2-bytes identification, followed by 2-bytes that describe the chunk
  310. * length. Known/guessed chunk identifications are:
  311. * 8001/8005/C001/C005 - Begin new frame
  312. * 8002/8006/C002/C006 - End frame
  313. * 0200/4200 - Contains actual image data, bayer or compressed
  314. * 0005 - 11 bytes of unknown data
  315. * 0100 - 2 bytes of unknown data
  316. * The 0005 and 0100 chunks seem to appear only in compressed stream.
  317. */
  318. static void stv06xx_pkt_scan(struct gspca_dev *gspca_dev,
  319. u8 *data, /* isoc packet */
  320. int len) /* iso packet length */
  321. {
  322. struct sd *sd = (struct sd *) gspca_dev;
  323. gspca_dbg(gspca_dev, D_PACK, "Packet of length %d arrived\n", len);
  324. /* A packet may contain several frames
  325. loop until the whole packet is reached */
  326. while (len) {
  327. int id, chunk_len;
  328. if (len < 4) {
  329. gspca_dbg(gspca_dev, D_PACK, "Packet is smaller than 4 bytes\n");
  330. return;
  331. }
  332. /* Capture the id */
  333. id = (data[0] << 8) | data[1];
  334. /* Capture the chunk length */
  335. chunk_len = (data[2] << 8) | data[3];
  336. gspca_dbg(gspca_dev, D_PACK, "Chunk id: %x, length: %d\n",
  337. id, chunk_len);
  338. data += 4;
  339. len -= 4;
  340. if (len < chunk_len) {
  341. gspca_err(gspca_dev, "URB packet length is smaller than the specified chunk length\n");
  342. gspca_dev->last_packet_type = DISCARD_PACKET;
  343. return;
  344. }
  345. /* First byte seem to be 02=data 2nd byte is unknown??? */
  346. if (sd->bridge == BRIDGE_ST6422 && (id & 0xff00) == 0x0200)
  347. goto frame_data;
  348. switch (id) {
  349. case 0x0200:
  350. case 0x4200:
  351. frame_data:
  352. gspca_dbg(gspca_dev, D_PACK, "Frame data packet detected\n");
  353. if (sd->to_skip) {
  354. int skip = (sd->to_skip < chunk_len) ?
  355. sd->to_skip : chunk_len;
  356. data += skip;
  357. len -= skip;
  358. chunk_len -= skip;
  359. sd->to_skip -= skip;
  360. }
  361. gspca_frame_add(gspca_dev, INTER_PACKET,
  362. data, chunk_len);
  363. break;
  364. case 0x8001:
  365. case 0x8005:
  366. case 0xc001:
  367. case 0xc005:
  368. gspca_dbg(gspca_dev, D_PACK, "Starting new frame\n");
  369. /* Create a new frame, chunk length should be zero */
  370. gspca_frame_add(gspca_dev, FIRST_PACKET,
  371. NULL, 0);
  372. if (sd->bridge == BRIDGE_ST6422)
  373. sd->to_skip = gspca_dev->pixfmt.width * 4;
  374. if (chunk_len)
  375. gspca_err(gspca_dev, "Chunk length is non-zero on a SOF\n");
  376. break;
  377. case 0x8002:
  378. case 0x8006:
  379. case 0xc002:
  380. gspca_dbg(gspca_dev, D_PACK, "End of frame detected\n");
  381. /* Complete the last frame (if any) */
  382. gspca_frame_add(gspca_dev, LAST_PACKET,
  383. NULL, 0);
  384. if (chunk_len)
  385. gspca_err(gspca_dev, "Chunk length is non-zero on a EOF\n");
  386. break;
  387. case 0x0005:
  388. gspca_dbg(gspca_dev, D_PACK, "Chunk 0x005 detected\n");
  389. /* Unknown chunk with 11 bytes of data,
  390. occurs just before end of each frame
  391. in compressed mode */
  392. break;
  393. case 0x0100:
  394. gspca_dbg(gspca_dev, D_PACK, "Chunk 0x0100 detected\n");
  395. /* Unknown chunk with 2 bytes of data,
  396. occurs 2-3 times per USB interrupt */
  397. break;
  398. case 0x42ff:
  399. gspca_dbg(gspca_dev, D_PACK, "Chunk 0x42ff detected\n");
  400. /* Special chunk seen sometimes on the ST6422 */
  401. break;
  402. default:
  403. gspca_dbg(gspca_dev, D_PACK, "Unknown chunk 0x%04x detected\n",
  404. id);
  405. /* Unknown chunk */
  406. }
  407. data += chunk_len;
  408. len -= chunk_len;
  409. }
  410. }
  411. #if IS_ENABLED(CONFIG_INPUT)
  412. static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
  413. u8 *data, /* interrupt packet data */
  414. int len) /* interrupt packet length */
  415. {
  416. int ret = -EINVAL;
  417. if (len == 1 && (data[0] == 0x80 || data[0] == 0x10)) {
  418. input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
  419. input_sync(gspca_dev->input_dev);
  420. ret = 0;
  421. }
  422. if (len == 1 && (data[0] == 0x88 || data[0] == 0x11)) {
  423. input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
  424. input_sync(gspca_dev->input_dev);
  425. ret = 0;
  426. }
  427. return ret;
  428. }
  429. #endif
  430. static int stv06xx_config(struct gspca_dev *gspca_dev,
  431. const struct usb_device_id *id);
  432. static void stv06xx_probe_error(struct gspca_dev *gspca_dev)
  433. {
  434. struct sd *sd = (struct sd *)gspca_dev;
  435. kfree(sd->sensor_priv);
  436. sd->sensor_priv = NULL;
  437. }
  438. /* sub-driver description */
  439. static const struct sd_desc sd_desc = {
  440. .name = MODULE_NAME,
  441. .config = stv06xx_config,
  442. .init = stv06xx_init,
  443. .init_controls = stv06xx_init_controls,
  444. .probe_error = stv06xx_probe_error,
  445. .start = stv06xx_start,
  446. .stopN = stv06xx_stopN,
  447. .pkt_scan = stv06xx_pkt_scan,
  448. .isoc_init = stv06xx_isoc_init,
  449. .isoc_nego = stv06xx_isoc_nego,
  450. #if IS_ENABLED(CONFIG_INPUT)
  451. .int_pkt_scan = sd_int_pkt_scan,
  452. #endif
  453. };
  454. /* This function is called at probe time */
  455. static int stv06xx_config(struct gspca_dev *gspca_dev,
  456. const struct usb_device_id *id)
  457. {
  458. struct sd *sd = (struct sd *) gspca_dev;
  459. gspca_dbg(gspca_dev, D_PROBE, "Configuring camera\n");
  460. sd->bridge = id->driver_info;
  461. gspca_dev->sd_desc = &sd_desc;
  462. if (dump_bridge)
  463. stv06xx_dump_bridge(sd);
  464. sd->sensor = &stv06xx_sensor_st6422;
  465. if (!sd->sensor->probe(sd))
  466. return 0;
  467. sd->sensor = &stv06xx_sensor_vv6410;
  468. if (!sd->sensor->probe(sd))
  469. return 0;
  470. sd->sensor = &stv06xx_sensor_hdcs1x00;
  471. if (!sd->sensor->probe(sd))
  472. return 0;
  473. sd->sensor = &stv06xx_sensor_hdcs1020;
  474. if (!sd->sensor->probe(sd))
  475. return 0;
  476. sd->sensor = &stv06xx_sensor_pb0100;
  477. if (!sd->sensor->probe(sd))
  478. return 0;
  479. sd->sensor = NULL;
  480. return -ENODEV;
  481. }
  482. /* -- module initialisation -- */
  483. static const struct usb_device_id device_table[] = {
  484. {USB_DEVICE(0x046d, 0x0840), .driver_info = BRIDGE_STV600 }, /* QuickCam Express */
  485. {USB_DEVICE(0x046d, 0x0850), .driver_info = BRIDGE_STV610 }, /* LEGO cam / QuickCam Web */
  486. {USB_DEVICE(0x046d, 0x0870), .driver_info = BRIDGE_STV602 }, /* Dexxa WebCam USB */
  487. {USB_DEVICE(0x046D, 0x08F0), .driver_info = BRIDGE_ST6422 }, /* QuickCam Messenger */
  488. {USB_DEVICE(0x046D, 0x08F5), .driver_info = BRIDGE_ST6422 }, /* QuickCam Communicate */
  489. {USB_DEVICE(0x046D, 0x08F6), .driver_info = BRIDGE_ST6422 }, /* QuickCam Messenger (new) */
  490. {}
  491. };
  492. MODULE_DEVICE_TABLE(usb, device_table);
  493. /* -- device connect -- */
  494. static int sd_probe(struct usb_interface *intf,
  495. const struct usb_device_id *id)
  496. {
  497. return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
  498. THIS_MODULE);
  499. }
  500. static void sd_disconnect(struct usb_interface *intf)
  501. {
  502. struct gspca_dev *gspca_dev = usb_get_intfdata(intf);
  503. struct sd *sd = (struct sd *) gspca_dev;
  504. void *priv = sd->sensor_priv;
  505. gspca_dbg(gspca_dev, D_PROBE, "Disconnecting the stv06xx device\n");
  506. sd->sensor = NULL;
  507. gspca_disconnect(intf);
  508. kfree(priv);
  509. }
  510. static struct usb_driver sd_driver = {
  511. .name = MODULE_NAME,
  512. .id_table = device_table,
  513. .probe = sd_probe,
  514. .disconnect = sd_disconnect,
  515. #ifdef CONFIG_PM
  516. .suspend = gspca_suspend,
  517. .resume = gspca_resume,
  518. .reset_resume = gspca_resume,
  519. #endif
  520. };
  521. module_usb_driver(sd_driver);
  522. module_param(dump_bridge, bool, S_IRUGO | S_IWUSR);
  523. MODULE_PARM_DESC(dump_bridge, "Dumps all usb bridge registers at startup");
  524. module_param(dump_sensor, bool, S_IRUGO | S_IWUSR);
  525. MODULE_PARM_DESC(dump_sensor, "Dumps all sensor registers at startup");