cx231xx-core.c 30 KB

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