stv06xx.c 16 KB

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