cx231xx-core.c 30 KB

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