cx231xx-core.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201
  1. /*
  2. cx231xx-core.c - driver for Conexant Cx23100/101/102
  3. USB video capture devices
  4. Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
  5. Based on em28xx driver
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <linux/init.h>
  19. #include <linux/list.h>
  20. #include <linux/module.h>
  21. #include <linux/usb.h>
  22. #include <linux/vmalloc.h>
  23. #include <media/v4l2-common.h>
  24. #include "cx231xx.h"
  25. #include "cx231xx-reg.h"
  26. /* #define ENABLE_DEBUG_ISOC_FRAMES */
  27. static unsigned int core_debug;
  28. module_param(core_debug, int, 0644);
  29. MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
  30. #define cx231xx_coredbg(fmt, arg...) do {\
  31. if (core_debug) \
  32. printk(KERN_INFO "%s %s :"fmt, \
  33. dev->name, __func__ , ##arg); } while (0)
  34. static unsigned int reg_debug;
  35. module_param(reg_debug, int, 0644);
  36. MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
  37. #define cx231xx_regdbg(fmt, arg...) do {\
  38. if (reg_debug) \
  39. printk(KERN_INFO "%s %s :"fmt, \
  40. dev->name, __func__ , ##arg); } while (0)
  41. static int alt = CX231XX_PINOUT;
  42. module_param(alt, int, 0644);
  43. MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
  44. /* FIXME */
  45. #define cx231xx_isocdbg(fmt, arg...) do {\
  46. if (core_debug) \
  47. printk(KERN_INFO "%s %s :"fmt, \
  48. dev->name, __func__ , ##arg); } while (0)
  49. /*****************************************************************
  50. * Device control list functions *
  51. ******************************************************************/
  52. static LIST_HEAD(cx231xx_devlist);
  53. static DEFINE_MUTEX(cx231xx_devlist_mutex);
  54. struct cx231xx *cx231xx_get_device(int minor,
  55. enum v4l2_buf_type *fh_type, int *has_radio)
  56. {
  57. struct cx231xx *h, *dev = NULL;
  58. *fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  59. *has_radio = 0;
  60. mutex_lock(&cx231xx_devlist_mutex);
  61. list_for_each_entry(h, &cx231xx_devlist, devlist) {
  62. if (h->vdev->minor == minor)
  63. dev = h;
  64. if (h->vbi_dev->minor == minor) {
  65. dev = h;
  66. *fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
  67. }
  68. if (h->radio_dev && h->radio_dev->minor == minor) {
  69. dev = h;
  70. *has_radio = 1;
  71. }
  72. }
  73. mutex_unlock(&cx231xx_devlist_mutex);
  74. return dev;
  75. }
  76. /*
  77. * cx231xx_realease_resources()
  78. * unregisters the v4l2,i2c and usb devices
  79. * called when the device gets disconected or at module unload
  80. */
  81. void cx231xx_remove_from_devlist(struct cx231xx *dev)
  82. {
  83. mutex_lock(&cx231xx_devlist_mutex);
  84. list_del(&dev->devlist);
  85. mutex_unlock(&cx231xx_devlist_mutex);
  86. };
  87. void cx231xx_add_into_devlist(struct cx231xx *dev)
  88. {
  89. mutex_lock(&cx231xx_devlist_mutex);
  90. list_add_tail(&dev->devlist, &cx231xx_devlist);
  91. mutex_unlock(&cx231xx_devlist_mutex);
  92. };
  93. static LIST_HEAD(cx231xx_extension_devlist);
  94. static DEFINE_MUTEX(cx231xx_extension_devlist_lock);
  95. int cx231xx_register_extension(struct cx231xx_ops *ops)
  96. {
  97. struct cx231xx *dev = NULL;
  98. mutex_lock(&cx231xx_devlist_mutex);
  99. mutex_lock(&cx231xx_extension_devlist_lock);
  100. list_add_tail(&ops->next, &cx231xx_extension_devlist);
  101. list_for_each_entry(dev, &cx231xx_devlist, devlist) {
  102. if (dev)
  103. ops->init(dev);
  104. }
  105. cx231xx_info("Cx231xx: Initialized (%s) extension\n", ops->name);
  106. mutex_unlock(&cx231xx_extension_devlist_lock);
  107. mutex_unlock(&cx231xx_devlist_mutex);
  108. return 0;
  109. }
  110. EXPORT_SYMBOL(cx231xx_register_extension);
  111. void cx231xx_unregister_extension(struct cx231xx_ops *ops)
  112. {
  113. struct cx231xx *dev = NULL;
  114. mutex_lock(&cx231xx_devlist_mutex);
  115. list_for_each_entry(dev, &cx231xx_devlist, devlist) {
  116. if (dev)
  117. ops->fini(dev);
  118. }
  119. mutex_lock(&cx231xx_extension_devlist_lock);
  120. cx231xx_info("Cx231xx: Removed (%s) extension\n", ops->name);
  121. list_del(&ops->next);
  122. mutex_unlock(&cx231xx_extension_devlist_lock);
  123. mutex_unlock(&cx231xx_devlist_mutex);
  124. }
  125. EXPORT_SYMBOL(cx231xx_unregister_extension);
  126. void cx231xx_init_extension(struct cx231xx *dev)
  127. {
  128. struct cx231xx_ops *ops = NULL;
  129. mutex_lock(&cx231xx_extension_devlist_lock);
  130. if (!list_empty(&cx231xx_extension_devlist)) {
  131. list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
  132. if (ops->init)
  133. ops->init(dev);
  134. }
  135. }
  136. mutex_unlock(&cx231xx_extension_devlist_lock);
  137. }
  138. void cx231xx_close_extension(struct cx231xx *dev)
  139. {
  140. struct cx231xx_ops *ops = NULL;
  141. mutex_lock(&cx231xx_extension_devlist_lock);
  142. if (!list_empty(&cx231xx_extension_devlist)) {
  143. list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
  144. if (ops->fini)
  145. ops->fini(dev);
  146. }
  147. }
  148. mutex_unlock(&cx231xx_extension_devlist_lock);
  149. }
  150. /****************************************************************
  151. * U S B related functions *
  152. *****************************************************************/
  153. int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
  154. struct cx231xx_i2c_xfer_data *req_data)
  155. {
  156. int status = 0;
  157. struct cx231xx *dev = i2c_bus->dev;
  158. struct VENDOR_REQUEST_IN ven_req;
  159. u8 saddr_len = 0;
  160. u8 _i2c_period = 0;
  161. u8 _i2c_nostop = 0;
  162. u8 _i2c_reserve = 0;
  163. /* Get the I2C period, nostop and reserve parameters */
  164. _i2c_period = i2c_bus->i2c_period;
  165. _i2c_nostop = i2c_bus->i2c_nostop;
  166. _i2c_reserve = i2c_bus->i2c_reserve;
  167. saddr_len = req_data->saddr_len;
  168. /* Set wValue */
  169. if (saddr_len == 1) /* need check saddr_len == 0 */
  170. ven_req.wValue =
  171. req_data->
  172. dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
  173. _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
  174. else
  175. ven_req.wValue =
  176. req_data->
  177. dev_addr << 9 | _i2c_period << 4 | saddr_len << 2 |
  178. _i2c_nostop << 1 | I2C_SYNC | _i2c_reserve << 6;
  179. /* set channel number */
  180. if (req_data->direction & I2C_M_RD) {
  181. /* channel number, for read,spec required channel_num +4 */
  182. ven_req.bRequest = i2c_bus->nr + 4;
  183. } else
  184. ven_req.bRequest = i2c_bus->nr; /* channel number, */
  185. /* set index value */
  186. switch (saddr_len) {
  187. case 0:
  188. ven_req.wIndex = 0; /* need check */
  189. break;
  190. case 1:
  191. ven_req.wIndex = (req_data->saddr_dat & 0xff);
  192. break;
  193. case 2:
  194. ven_req.wIndex = req_data->saddr_dat;
  195. break;
  196. }
  197. /* set wLength value */
  198. ven_req.wLength = req_data->buf_size;
  199. /* set bData value */
  200. ven_req.bData = 0;
  201. /* set the direction */
  202. if (req_data->direction) {
  203. ven_req.direction = USB_DIR_IN;
  204. memset(req_data->p_buffer, 0x00, ven_req.wLength);
  205. } else
  206. ven_req.direction = USB_DIR_OUT;
  207. /* set the buffer for read / write */
  208. ven_req.pBuff = req_data->p_buffer;
  209. /* call common vendor command request */
  210. status = cx231xx_send_vendor_cmd(dev, &ven_req);
  211. if (status < 0) {
  212. cx231xx_info
  213. ("UsbInterface::sendCommand, failed with status -%d\n",
  214. status);
  215. }
  216. return status;
  217. }
  218. EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
  219. /*
  220. * cx231xx_read_ctrl_reg()
  221. * reads data from the usb device specifying bRequest and wValue
  222. */
  223. int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
  224. char *buf, int len)
  225. {
  226. u8 val = 0;
  227. int ret;
  228. int pipe = usb_rcvctrlpipe(dev->udev, 0);
  229. if (dev->state & DEV_DISCONNECTED)
  230. return -ENODEV;
  231. if (len > URB_MAX_CTRL_SIZE)
  232. return -EINVAL;
  233. switch (len) {
  234. case 1:
  235. val = ENABLE_ONE_BYTE;
  236. break;
  237. case 2:
  238. val = ENABLE_TWE_BYTE;
  239. break;
  240. case 3:
  241. val = ENABLE_THREE_BYTE;
  242. break;
  243. case 4:
  244. val = ENABLE_FOUR_BYTE;
  245. break;
  246. default:
  247. val = 0xFF; /* invalid option */
  248. }
  249. if (val == 0xFF)
  250. return -EINVAL;
  251. if (reg_debug) {
  252. cx231xx_isocdbg("(pipe 0x%08x): "
  253. "IN: %02x %02x %02x %02x %02x %02x %02x %02x ",
  254. pipe,
  255. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  256. req, 0, val,
  257. reg & 0xff, reg >> 8, len & 0xff, len >> 8);
  258. }
  259. /* mutex_lock(&dev->ctrl_urb_lock); */
  260. ret = usb_control_msg(dev->udev, pipe, req,
  261. USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  262. val, reg, dev->urb_buf, len, HZ);
  263. if (ret < 0) {
  264. cx231xx_isocdbg(" failed!\n");
  265. /* mutex_unlock(&dev->ctrl_urb_lock); */
  266. return ret;
  267. }
  268. if (len)
  269. memcpy(buf, dev->urb_buf, len);
  270. /* mutex_unlock(&dev->ctrl_urb_lock); */
  271. if (reg_debug) {
  272. int byte;
  273. cx231xx_isocdbg("<<<");
  274. for (byte = 0; byte < len; byte++)
  275. cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
  276. cx231xx_isocdbg("\n");
  277. }
  278. return ret;
  279. }
  280. int cx231xx_send_vendor_cmd(struct cx231xx *dev,
  281. struct VENDOR_REQUEST_IN *ven_req)
  282. {
  283. int ret;
  284. int pipe = 0;
  285. if (dev->state & DEV_DISCONNECTED)
  286. return -ENODEV;
  287. if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
  288. return -EINVAL;
  289. if (ven_req->direction)
  290. pipe = usb_rcvctrlpipe(dev->udev, 0);
  291. else
  292. pipe = usb_sndctrlpipe(dev->udev, 0);
  293. if (reg_debug) {
  294. int byte;
  295. cx231xx_isocdbg("(pipe 0x%08x): "
  296. "OUT: %02x %02x %02x %04x %04x %04x >>>",
  297. pipe,
  298. ven_req->
  299. direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  300. ven_req->bRequest, 0, ven_req->wValue,
  301. ven_req->wIndex, ven_req->wLength);
  302. for (byte = 0; byte < ven_req->wLength; byte++)
  303. cx231xx_isocdbg(" %02x",
  304. (unsigned char)ven_req->pBuff[byte]);
  305. cx231xx_isocdbg("\n");
  306. }
  307. /* mutex_lock(&dev->ctrl_urb_lock); */
  308. ret = usb_control_msg(dev->udev, pipe, ven_req->bRequest,
  309. ven_req->
  310. direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  311. ven_req->wValue, ven_req->wIndex, ven_req->pBuff,
  312. ven_req->wLength, HZ);
  313. /* mutex_unlock(&dev->ctrl_urb_lock); */
  314. return ret;
  315. }
  316. /*
  317. * cx231xx_write_ctrl_reg()
  318. * sends data to the usb device, specifying bRequest
  319. */
  320. int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
  321. int len)
  322. {
  323. u8 val = 0;
  324. int ret;
  325. int pipe = usb_sndctrlpipe(dev->udev, 0);
  326. if (dev->state & DEV_DISCONNECTED)
  327. return -ENODEV;
  328. if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
  329. return -EINVAL;
  330. switch (len) {
  331. case 1:
  332. val = ENABLE_ONE_BYTE;
  333. break;
  334. case 2:
  335. val = ENABLE_TWE_BYTE;
  336. break;
  337. case 3:
  338. val = ENABLE_THREE_BYTE;
  339. break;
  340. case 4:
  341. val = ENABLE_FOUR_BYTE;
  342. break;
  343. default:
  344. val = 0xFF; /* invalid option */
  345. }
  346. if (val == 0xFF)
  347. return -EINVAL;
  348. if (reg_debug) {
  349. int byte;
  350. cx231xx_isocdbg("(pipe 0x%08x): "
  351. "OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
  352. pipe,
  353. USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  354. req, 0, val, reg & 0xff,
  355. reg >> 8, len & 0xff, len >> 8);
  356. for (byte = 0; byte < len; byte++)
  357. cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
  358. cx231xx_isocdbg("\n");
  359. }
  360. /* mutex_lock(&dev->ctrl_urb_lock); */
  361. memcpy(dev->urb_buf, buf, len);
  362. ret = usb_control_msg(dev->udev, pipe, req,
  363. USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
  364. val, reg, dev->urb_buf, len, HZ);
  365. /* mutex_unlock(&dev->ctrl_urb_lock); */
  366. return ret;
  367. }
  368. /****************************************************************
  369. * USB Alternate Setting functions *
  370. *****************************************************************/
  371. int cx231xx_set_video_alternate(struct cx231xx *dev)
  372. {
  373. int errCode, prev_alt = dev->video_mode.alt;
  374. unsigned int min_pkt_size = dev->width * 2 + 4;
  375. u32 usb_interface_index = 0;
  376. /* When image size is bigger than a certain value,
  377. the frame size should be increased, otherwise, only
  378. green screen will be received.
  379. */
  380. if (dev->width * 2 * dev->height > 720 * 240 * 2)
  381. min_pkt_size *= 2;
  382. if (dev->width > 360) {
  383. /* resolutions: 720,704,640 */
  384. dev->video_mode.alt = 3;
  385. } else if (dev->width > 180) {
  386. /* resolutions: 360,352,320,240 */
  387. dev->video_mode.alt = 2;
  388. } else if (dev->width > 0) {
  389. /* resolutions: 180,176,160,128,88 */
  390. dev->video_mode.alt = 1;
  391. } else {
  392. /* Change to alt0 BULK to release USB bandwidth */
  393. dev->video_mode.alt = 0;
  394. }
  395. /* Get the correct video interface Index */
  396. usb_interface_index =
  397. dev->current_pcb_config.hs_config_info[0].interface_info.
  398. video_index + 1;
  399. if (dev->video_mode.alt != prev_alt) {
  400. cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
  401. min_pkt_size, dev->video_mode.alt);
  402. dev->video_mode.max_pkt_size =
  403. dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
  404. cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
  405. dev->video_mode.alt,
  406. dev->video_mode.max_pkt_size);
  407. cx231xx_info
  408. (" setting alt %d with wMaxPktSize=%u , Interface = %d\n",
  409. dev->video_mode.alt, dev->video_mode.max_pkt_size,
  410. usb_interface_index);
  411. errCode =
  412. usb_set_interface(dev->udev, usb_interface_index,
  413. dev->video_mode.alt);
  414. if (errCode < 0) {
  415. cx231xx_errdev
  416. ("cannot change alt number to %d (error=%i)\n",
  417. dev->video_mode.alt, errCode);
  418. return errCode;
  419. }
  420. }
  421. return 0;
  422. }
  423. int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
  424. {
  425. int status = 0;
  426. u32 usb_interface_index = 0;
  427. u32 max_pkt_size = 0;
  428. switch (index) {
  429. case INDEX_TS1:
  430. usb_interface_index =
  431. dev->current_pcb_config.hs_config_info[0].interface_info.
  432. ts1_index + 1;
  433. dev->video_mode.alt = alt;
  434. if (dev->ts1_mode.alt_max_pkt_size != NULL)
  435. max_pkt_size = dev->ts1_mode.max_pkt_size =
  436. dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
  437. break;
  438. case INDEX_TS2:
  439. usb_interface_index =
  440. dev->current_pcb_config.hs_config_info[0].interface_info.
  441. ts2_index + 1;
  442. break;
  443. case INDEX_AUDIO:
  444. usb_interface_index =
  445. dev->current_pcb_config.hs_config_info[0].interface_info.
  446. audio_index + 1;
  447. dev->adev.alt = alt;
  448. if (dev->adev.alt_max_pkt_size != NULL)
  449. max_pkt_size = dev->adev.max_pkt_size =
  450. dev->adev.alt_max_pkt_size[dev->adev.alt];
  451. break;
  452. case INDEX_VIDEO:
  453. usb_interface_index =
  454. dev->current_pcb_config.hs_config_info[0].interface_info.
  455. video_index + 1;
  456. dev->video_mode.alt = alt;
  457. if (dev->video_mode.alt_max_pkt_size != NULL)
  458. max_pkt_size = dev->video_mode.max_pkt_size =
  459. dev->video_mode.alt_max_pkt_size[dev->video_mode.
  460. alt];
  461. break;
  462. case INDEX_VANC:
  463. usb_interface_index =
  464. dev->current_pcb_config.hs_config_info[0].interface_info.
  465. vanc_index + 1;
  466. dev->vbi_mode.alt = alt;
  467. if (dev->vbi_mode.alt_max_pkt_size != NULL)
  468. max_pkt_size = dev->vbi_mode.max_pkt_size =
  469. dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
  470. break;
  471. case INDEX_HANC:
  472. usb_interface_index =
  473. dev->current_pcb_config.hs_config_info[0].interface_info.
  474. hanc_index + 1;
  475. dev->sliced_cc_mode.alt = alt;
  476. if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
  477. max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
  478. dev->sliced_cc_mode.alt_max_pkt_size[dev->
  479. sliced_cc_mode.
  480. alt];
  481. break;
  482. default:
  483. break;
  484. }
  485. if (alt > 0 && max_pkt_size == 0) {
  486. cx231xx_errdev
  487. ("can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
  488. usb_interface_index, alt);
  489. return -1;
  490. }
  491. cx231xx_info
  492. (" setting alternate %d with wMaxPacketSize=%u , Interface = %d\n",
  493. alt, max_pkt_size, usb_interface_index);
  494. if (usb_interface_index > 0) {
  495. status = usb_set_interface(dev->udev, usb_interface_index, alt);
  496. if (status < 0) {
  497. cx231xx_errdev
  498. ("can't change interface %d alt no. to %d (err=%i)\n",
  499. usb_interface_index, alt, status);
  500. return status;
  501. }
  502. }
  503. return status;
  504. }
  505. EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
  506. int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
  507. {
  508. int rc = 0;
  509. if (!gpio)
  510. return rc;
  511. /* Send GPIO reset sequences specified at board entry */
  512. while (gpio->sleep >= 0) {
  513. rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
  514. if (rc < 0)
  515. return rc;
  516. if (gpio->sleep > 0)
  517. msleep(gpio->sleep);
  518. gpio++;
  519. }
  520. return rc;
  521. }
  522. int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
  523. {
  524. if (dev->mode == set_mode)
  525. return 0;
  526. if (set_mode == CX231XX_SUSPEND) {
  527. /* Set the chip in power saving mode */
  528. dev->mode = set_mode;
  529. }
  530. /* Resource is locked */
  531. if (dev->mode != CX231XX_SUSPEND)
  532. return -EINVAL;
  533. dev->mode = set_mode;
  534. if (dev->mode == CX231XX_DIGITAL_MODE)
  535. ;/* Set Digital power mode */
  536. else
  537. ;/* Set Analog Power mode */
  538. return 0;
  539. }
  540. EXPORT_SYMBOL_GPL(cx231xx_set_mode);
  541. /*****************************************************************
  542. * URB Streaming functions *
  543. ******************************************************************/
  544. /*
  545. * IRQ callback, called by URB callback
  546. */
  547. static void cx231xx_irq_callback(struct urb *urb)
  548. {
  549. struct cx231xx_dmaqueue *dma_q = urb->context;
  550. struct cx231xx_video_mode *vmode =
  551. container_of(dma_q, struct cx231xx_video_mode, vidq);
  552. struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
  553. int rc, i;
  554. switch (urb->status) {
  555. case 0: /* success */
  556. case -ETIMEDOUT: /* NAK */
  557. break;
  558. case -ECONNRESET: /* kill */
  559. case -ENOENT:
  560. case -ESHUTDOWN:
  561. return;
  562. default: /* error */
  563. cx231xx_isocdbg("urb completition error %d.\n", urb->status);
  564. break;
  565. }
  566. /* Copy data from URB */
  567. spin_lock(&dev->video_mode.slock);
  568. rc = dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
  569. spin_unlock(&dev->video_mode.slock);
  570. /* Reset urb buffers */
  571. for (i = 0; i < urb->number_of_packets; i++) {
  572. urb->iso_frame_desc[i].status = 0;
  573. urb->iso_frame_desc[i].actual_length = 0;
  574. }
  575. urb->status = 0;
  576. urb->status = usb_submit_urb(urb, GFP_ATOMIC);
  577. if (urb->status) {
  578. cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
  579. urb->status);
  580. }
  581. }
  582. /*
  583. * Stop and Deallocate URBs
  584. */
  585. void cx231xx_uninit_isoc(struct cx231xx *dev)
  586. {
  587. struct urb *urb;
  588. int i;
  589. cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
  590. dev->video_mode.isoc_ctl.nfields = -1;
  591. for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
  592. urb = dev->video_mode.isoc_ctl.urb[i];
  593. if (urb) {
  594. if (!irqs_disabled())
  595. usb_kill_urb(urb);
  596. else
  597. usb_unlink_urb(urb);
  598. if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
  599. usb_buffer_free(dev->udev,
  600. urb->transfer_buffer_length,
  601. dev->video_mode.isoc_ctl.
  602. transfer_buffer[i],
  603. urb->transfer_dma);
  604. }
  605. usb_free_urb(urb);
  606. dev->video_mode.isoc_ctl.urb[i] = NULL;
  607. }
  608. dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
  609. }
  610. kfree(dev->video_mode.isoc_ctl.urb);
  611. kfree(dev->video_mode.isoc_ctl.transfer_buffer);
  612. dev->video_mode.isoc_ctl.urb = NULL;
  613. dev->video_mode.isoc_ctl.transfer_buffer = NULL;
  614. dev->video_mode.isoc_ctl.num_bufs = 0;
  615. cx231xx_capture_start(dev, 0, Raw_Video);
  616. }
  617. EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
  618. /*
  619. * Allocate URBs and start IRQ
  620. */
  621. int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
  622. int num_bufs, int max_pkt_size,
  623. int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
  624. {
  625. struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
  626. int i;
  627. int sb_size, pipe;
  628. struct urb *urb;
  629. int j, k;
  630. int rc;
  631. cx231xx_isocdbg("cx231xx: called cx231xx_prepare_isoc\n");
  632. dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
  633. cx231xx_info("Setting Video mux to %d\n", dev->video_input);
  634. video_mux(dev, dev->video_input);
  635. /* De-allocates all pending stuff */
  636. cx231xx_uninit_isoc(dev);
  637. dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
  638. dev->video_mode.isoc_ctl.num_bufs = num_bufs;
  639. dma_q->pos = 0;
  640. dma_q->is_partial_line = 0;
  641. dma_q->last_sav = 0;
  642. dma_q->current_field = -1;
  643. dma_q->field1_done = 0;
  644. dma_q->lines_per_field = dev->height / 2;
  645. dma_q->bytes_left_in_line = dev->width << 1;
  646. dma_q->lines_completed = 0;
  647. for (i = 0; i < 8; i++)
  648. dma_q->partial_buf[i] = 0;
  649. dev->video_mode.isoc_ctl.urb =
  650. kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
  651. if (!dev->video_mode.isoc_ctl.urb) {
  652. cx231xx_errdev("cannot alloc memory for usb buffers\n");
  653. return -ENOMEM;
  654. }
  655. dev->video_mode.isoc_ctl.transfer_buffer =
  656. kzalloc(sizeof(void *) * num_bufs, GFP_KERNEL);
  657. if (!dev->video_mode.isoc_ctl.transfer_buffer) {
  658. cx231xx_errdev("cannot allocate memory for usbtransfer\n");
  659. kfree(dev->video_mode.isoc_ctl.urb);
  660. return -ENOMEM;
  661. }
  662. dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
  663. dev->video_mode.isoc_ctl.buf = NULL;
  664. sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
  665. /* allocate urbs and transfer buffers */
  666. for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
  667. urb = usb_alloc_urb(max_packets, GFP_KERNEL);
  668. if (!urb) {
  669. cx231xx_err("cannot alloc isoc_ctl.urb %i\n", i);
  670. cx231xx_uninit_isoc(dev);
  671. return -ENOMEM;
  672. }
  673. dev->video_mode.isoc_ctl.urb[i] = urb;
  674. dev->video_mode.isoc_ctl.transfer_buffer[i] =
  675. usb_buffer_alloc(dev->udev, sb_size, GFP_KERNEL,
  676. &urb->transfer_dma);
  677. if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
  678. cx231xx_err("unable to allocate %i bytes for transfer"
  679. " buffer %i%s\n",
  680. sb_size, i,
  681. in_interrupt() ? " while in int" : "");
  682. cx231xx_uninit_isoc(dev);
  683. return -ENOMEM;
  684. }
  685. memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
  686. pipe =
  687. usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
  688. usb_fill_int_urb(urb, dev->udev, pipe,
  689. dev->video_mode.isoc_ctl.transfer_buffer[i],
  690. sb_size, cx231xx_irq_callback, dma_q, 1);
  691. urb->number_of_packets = max_packets;
  692. urb->transfer_flags = URB_ISO_ASAP;
  693. k = 0;
  694. for (j = 0; j < max_packets; j++) {
  695. urb->iso_frame_desc[j].offset = k;
  696. urb->iso_frame_desc[j].length =
  697. dev->video_mode.isoc_ctl.max_pkt_size;
  698. k += dev->video_mode.isoc_ctl.max_pkt_size;
  699. }
  700. }
  701. init_waitqueue_head(&dma_q->wq);
  702. /* submit urbs and enables IRQ */
  703. for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
  704. rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
  705. GFP_ATOMIC);
  706. if (rc) {
  707. cx231xx_err("submit of urb %i failed (error=%i)\n", i,
  708. rc);
  709. cx231xx_uninit_isoc(dev);
  710. return rc;
  711. }
  712. }
  713. cx231xx_capture_start(dev, 1, Raw_Video);
  714. return 0;
  715. }
  716. EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
  717. /*****************************************************************
  718. * Device Init/UnInit functions *
  719. ******************************************************************/
  720. int cx231xx_dev_init(struct cx231xx *dev)
  721. {
  722. int errCode = 0;
  723. /* Initialize I2C bus */
  724. /* External Master 1 Bus */
  725. dev->i2c_bus[0].nr = 0;
  726. dev->i2c_bus[0].dev = dev;
  727. dev->i2c_bus[0].i2c_period = I2C_SPEED_1M; /* 1MHz */
  728. dev->i2c_bus[0].i2c_nostop = 0;
  729. dev->i2c_bus[0].i2c_reserve = 0;
  730. /* External Master 2 Bus */
  731. dev->i2c_bus[1].nr = 1;
  732. dev->i2c_bus[1].dev = dev;
  733. dev->i2c_bus[1].i2c_period = I2C_SPEED_1M; /* 1MHz */
  734. dev->i2c_bus[1].i2c_nostop = 0;
  735. dev->i2c_bus[1].i2c_reserve = 0;
  736. /* Internal Master 3 Bus */
  737. dev->i2c_bus[2].nr = 2;
  738. dev->i2c_bus[2].dev = dev;
  739. dev->i2c_bus[2].i2c_period = I2C_SPEED_400K; /* 400kHz */
  740. dev->i2c_bus[2].i2c_nostop = 0;
  741. dev->i2c_bus[2].i2c_reserve = 0;
  742. /* register I2C buses */
  743. cx231xx_i2c_register(&dev->i2c_bus[0]);
  744. cx231xx_i2c_register(&dev->i2c_bus[1]);
  745. cx231xx_i2c_register(&dev->i2c_bus[2]);
  746. /* init hardware */
  747. /* Note : with out calling set power mode function,
  748. colibri can not be set up correctly */
  749. errCode = cx231xx_set_power_mode(dev, POLARIS_AVMODE_ANALOGT_TV);
  750. if (errCode < 0) {
  751. cx231xx_errdev
  752. ("%s: Failed to set Power - errCode [%d]!\n",
  753. __func__, errCode);
  754. return errCode;
  755. }
  756. /* initialize Colibri block */
  757. errCode = cx231xx_colibri_init_super_block(dev, 0x23c);
  758. if (errCode < 0) {
  759. cx231xx_errdev
  760. ("%s: cx231xx_colibri init super block - errCode [%d]!\n",
  761. __func__, errCode);
  762. return errCode;
  763. }
  764. errCode = cx231xx_colibri_init_channels(dev);
  765. if (errCode < 0) {
  766. cx231xx_errdev
  767. ("%s: cx231xx_colibri init channels - errCode [%d]!\n",
  768. __func__, errCode);
  769. return errCode;
  770. }
  771. /* Set DIF in By pass mode */
  772. errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
  773. if (errCode < 0) {
  774. cx231xx_errdev
  775. ("%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
  776. __func__, errCode);
  777. return errCode;
  778. }
  779. /* flatiron related functions */
  780. errCode = cx231xx_flatiron_initialize(dev);
  781. if (errCode < 0) {
  782. cx231xx_errdev
  783. ("%s: cx231xx_flatiron initialize - errCode [%d]!\n",
  784. __func__, errCode);
  785. return errCode;
  786. }
  787. /* init control pins */
  788. errCode = cx231xx_init_ctrl_pin_status(dev);
  789. if (errCode < 0) {
  790. cx231xx_errdev("%s: cx231xx_init ctrl pins - errCode [%d]!\n",
  791. __func__, errCode);
  792. return errCode;
  793. }
  794. /* set AGC mode to Analog */
  795. errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
  796. if (errCode < 0) {
  797. cx231xx_errdev
  798. ("%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
  799. __func__, errCode);
  800. return errCode;
  801. }
  802. /* set all alternate settings to zero initially */
  803. cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
  804. cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
  805. cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
  806. if (dev->board.has_dvb)
  807. cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
  808. /* set the I2C master port to 3 on channel 1 */
  809. errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3);
  810. return errCode;
  811. }
  812. EXPORT_SYMBOL_GPL(cx231xx_dev_init);
  813. void cx231xx_dev_uninit(struct cx231xx *dev)
  814. {
  815. /* Un Initialize I2C bus */
  816. cx231xx_i2c_unregister(&dev->i2c_bus[2]);
  817. cx231xx_i2c_unregister(&dev->i2c_bus[1]);
  818. cx231xx_i2c_unregister(&dev->i2c_bus[0]);
  819. }
  820. EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
  821. /*****************************************************************
  822. * G P I O related functions *
  823. ******************************************************************/
  824. int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 * gpio_val,
  825. u8 len, u8 request, u8 direction)
  826. {
  827. int status = 0;
  828. struct VENDOR_REQUEST_IN ven_req;
  829. /* Set wValue */
  830. ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
  831. /* set request */
  832. if (!request) {
  833. if (direction)
  834. ven_req.bRequest = VRT_GET_GPIO; /* 0x8 gpio */
  835. else
  836. ven_req.bRequest = VRT_SET_GPIO; /* 0x9 gpio */
  837. } else {
  838. if (direction)
  839. ven_req.bRequest = VRT_GET_GPIE; /* 0xa gpie */
  840. else
  841. ven_req.bRequest = VRT_SET_GPIE; /* 0xb gpie */
  842. }
  843. /* set index value */
  844. ven_req.wIndex = (u16) (gpio_bit & 0xffff);
  845. /* set wLength value */
  846. ven_req.wLength = len;
  847. /* set bData value */
  848. ven_req.bData = 0;
  849. /* set the buffer for read / write */
  850. ven_req.pBuff = gpio_val;
  851. /* set the direction */
  852. if (direction) {
  853. ven_req.direction = USB_DIR_IN;
  854. memset(ven_req.pBuff, 0x00, ven_req.wLength);
  855. } else
  856. ven_req.direction = USB_DIR_OUT;
  857. /* call common vendor command request */
  858. status = cx231xx_send_vendor_cmd(dev, &ven_req);
  859. if (status < 0) {
  860. cx231xx_info
  861. ("UsbInterface::sendCommand, failed with status -%d\n",
  862. status);
  863. }
  864. return status;
  865. }
  866. EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
  867. /*****************************************************************
  868. * C O N T R O L - Register R E A D / W R I T E functions *
  869. *****************************************************************/
  870. int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
  871. {
  872. u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
  873. u32 tmp = 0;
  874. int status = 0;
  875. status =
  876. cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
  877. if (status < 0)
  878. return status;
  879. tmp = *((u32 *) value);
  880. tmp |= mode;
  881. value[0] = (u8) tmp;
  882. value[1] = (u8) (tmp >> 8);
  883. value[2] = (u8) (tmp >> 16);
  884. value[3] = (u8) (tmp >> 24);
  885. status =
  886. cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
  887. return status;
  888. }
  889. /*****************************************************************
  890. * I 2 C Internal C O N T R O L functions *
  891. *****************************************************************/
  892. int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
  893. u8 saddr_len, u32 *data, u8 data_len)
  894. {
  895. int status = 0;
  896. struct cx231xx_i2c_xfer_data req_data;
  897. u8 value[4] = { 0, 0, 0, 0 };
  898. if (saddr_len == 0)
  899. saddr = 0;
  900. else if (saddr_len == 0)
  901. saddr &= 0xff;
  902. /* prepare xfer_data struct */
  903. req_data.dev_addr = dev_addr >> 1;
  904. req_data.direction = I2C_M_RD;
  905. req_data.saddr_len = saddr_len;
  906. req_data.saddr_dat = saddr;
  907. req_data.buf_size = data_len;
  908. req_data.p_buffer = (u8 *) value;
  909. /* usb send command */
  910. status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
  911. if (status >= 0) {
  912. /* Copy the data read back to main buffer */
  913. if (data_len == 1)
  914. *data = value[0];
  915. else
  916. *data =
  917. value[0] | value[1] << 8 | value[2] << 16 | value[3]
  918. << 24;
  919. }
  920. return status;
  921. }
  922. int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
  923. u8 saddr_len, u32 data, u8 data_len)
  924. {
  925. int status = 0;
  926. u8 value[4] = { 0, 0, 0, 0 };
  927. struct cx231xx_i2c_xfer_data req_data;
  928. value[0] = (u8) data;
  929. value[1] = (u8) (data >> 8);
  930. value[2] = (u8) (data >> 16);
  931. value[3] = (u8) (data >> 24);
  932. if (saddr_len == 0)
  933. saddr = 0;
  934. else if (saddr_len == 0)
  935. saddr &= 0xff;
  936. /* prepare xfer_data struct */
  937. req_data.dev_addr = dev_addr >> 1;
  938. req_data.direction = 0;
  939. req_data.saddr_len = saddr_len;
  940. req_data.saddr_dat = saddr;
  941. req_data.buf_size = data_len;
  942. req_data.p_buffer = value;
  943. /* usb send command */
  944. status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
  945. return status;
  946. }
  947. int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
  948. u16 register_address, u8 bit_start, u8 bit_end,
  949. u32 value)
  950. {
  951. int status = 0;
  952. u32 tmp;
  953. u32 mask = 0;
  954. int i;
  955. if (bit_start > (size - 1) || bit_end > (size - 1))
  956. return -1;
  957. if (size == 8) {
  958. status =
  959. cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
  960. &tmp, 1);
  961. } else {
  962. status =
  963. cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
  964. &tmp, 4);
  965. }
  966. if (status < 0)
  967. return status;
  968. mask = 1 << bit_end;
  969. for (i = bit_end; i > bit_start && i > 0; i--)
  970. mask = mask + (1 << (i - 1));
  971. value <<= bit_start;
  972. if (size == 8) {
  973. tmp &= ~mask;
  974. tmp |= value;
  975. tmp &= 0xff;
  976. status =
  977. cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
  978. tmp, 1);
  979. } else {
  980. tmp &= ~mask;
  981. tmp |= value;
  982. status =
  983. cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
  984. tmp, 4);
  985. }
  986. return status;
  987. }
  988. int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
  989. u16 saddr, u32 mask, u32 value)
  990. {
  991. u32 temp;
  992. int status = 0;
  993. status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
  994. if (status < 0)
  995. return status;
  996. temp &= ~mask;
  997. temp |= value;
  998. status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
  999. return status;
  1000. }
  1001. u32 cx231xx_set_field(u32 field_mask, u32 data)
  1002. {
  1003. u32 temp;
  1004. for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
  1005. data <<= 1;
  1006. return data;
  1007. }