1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3   cx231xx-core.c - driver for Conexant Cx23100/101/102
4				USB video capture devices
5
6   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
7				Based on em28xx driver
8
9 */
10
11#include "cx231xx.h"
12#include <linux/init.h>
13#include <linux/list.h>
14#include <linux/module.h>
15#include <linux/slab.h>
16#include <linux/vmalloc.h>
17#include <media/v4l2-common.h>
18#include <media/tuner.h>
19
20#include "cx231xx-reg.h"
21
22/* #define ENABLE_DEBUG_ISOC_FRAMES */
23
24static unsigned int core_debug;
25module_param(core_debug, int, 0644);
26MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
27
28#define cx231xx_coredbg(fmt, arg...) do {\
29	if (core_debug) \
30		printk(KERN_INFO "%s %s :"fmt, \
31			 dev->name, __func__ , ##arg); } while (0)
32
33static unsigned int reg_debug;
34module_param(reg_debug, int, 0644);
35MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
36
37static int alt = CX231XX_PINOUT;
38module_param(alt, int, 0644);
39MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
40
41#define cx231xx_isocdbg(fmt, arg...) do {\
42	if (core_debug) \
43		printk(KERN_INFO "%s %s :"fmt, \
44			 dev->name, __func__ , ##arg); } while (0)
45
46/*****************************************************************
47*             Device control list functions					 *
48******************************************************************/
49
50LIST_HEAD(cx231xx_devlist);
51static DEFINE_MUTEX(cx231xx_devlist_mutex);
52
53/*
54 * cx231xx_realease_resources()
55 * unregisters the v4l2,i2c and usb devices
56 * called when the device gets disconnected or at module unload
57*/
58void cx231xx_remove_from_devlist(struct cx231xx *dev)
59{
60	if (dev == NULL)
61		return;
62	if (dev->udev == NULL)
63		return;
64
65	if (atomic_read(&dev->devlist_count) > 0) {
66		mutex_lock(&cx231xx_devlist_mutex);
67		list_del(&dev->devlist);
68		atomic_dec(&dev->devlist_count);
69		mutex_unlock(&cx231xx_devlist_mutex);
70	}
71};
72
73void cx231xx_add_into_devlist(struct cx231xx *dev)
74{
75	mutex_lock(&cx231xx_devlist_mutex);
76	list_add_tail(&dev->devlist, &cx231xx_devlist);
77	atomic_inc(&dev->devlist_count);
78	mutex_unlock(&cx231xx_devlist_mutex);
79};
80
81static LIST_HEAD(cx231xx_extension_devlist);
82
83int cx231xx_register_extension(struct cx231xx_ops *ops)
84{
85	struct cx231xx *dev = NULL;
86
87	mutex_lock(&cx231xx_devlist_mutex);
88	list_add_tail(&ops->next, &cx231xx_extension_devlist);
89	list_for_each_entry(dev, &cx231xx_devlist, devlist) {
90		ops->init(dev);
91		dev_info(dev->dev, "%s initialized\n", ops->name);
92	}
93	mutex_unlock(&cx231xx_devlist_mutex);
94	return 0;
95}
96EXPORT_SYMBOL(cx231xx_register_extension);
97
98void cx231xx_unregister_extension(struct cx231xx_ops *ops)
99{
100	struct cx231xx *dev = NULL;
101
102	mutex_lock(&cx231xx_devlist_mutex);
103	list_for_each_entry(dev, &cx231xx_devlist, devlist) {
104		ops->fini(dev);
105		dev_info(dev->dev, "%s removed\n", ops->name);
106	}
107
108	list_del(&ops->next);
109	mutex_unlock(&cx231xx_devlist_mutex);
110}
111EXPORT_SYMBOL(cx231xx_unregister_extension);
112
113void cx231xx_init_extension(struct cx231xx *dev)
114{
115	struct cx231xx_ops *ops = NULL;
116
117	mutex_lock(&cx231xx_devlist_mutex);
118	list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
119		if (ops->init)
120			ops->init(dev);
121	}
122	mutex_unlock(&cx231xx_devlist_mutex);
123}
124
125void cx231xx_close_extension(struct cx231xx *dev)
126{
127	struct cx231xx_ops *ops = NULL;
128
129	mutex_lock(&cx231xx_devlist_mutex);
130	list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
131		if (ops->fini)
132			ops->fini(dev);
133	}
134	mutex_unlock(&cx231xx_devlist_mutex);
135}
136
137/****************************************************************
138*               U S B related functions                         *
139*****************************************************************/
140int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
141			     struct cx231xx_i2c_xfer_data *req_data)
142{
143	int status = 0;
144	struct cx231xx *dev = i2c_bus->dev;
145	struct VENDOR_REQUEST_IN ven_req;
146
147	u8 saddr_len = 0;
148	u8 _i2c_period = 0;
149	u8 _i2c_nostop = 0;
150	u8 _i2c_reserve = 0;
151
152	if (dev->state & DEV_DISCONNECTED)
153		return -ENODEV;
154
155	/* Get the I2C period, nostop and reserve parameters */
156	_i2c_period = i2c_bus->i2c_period;
157	_i2c_nostop = i2c_bus->i2c_nostop;
158	_i2c_reserve = i2c_bus->i2c_reserve;
159
160	saddr_len = req_data->saddr_len;
161
162	/* Set wValue */
163	ven_req.wValue = (req_data->dev_addr << 9 | _i2c_period << 4 |
164			  saddr_len << 2 | _i2c_nostop << 1 | I2C_SYNC |
165			  _i2c_reserve << 6);
166
167	/* set channel number */
168	if (req_data->direction & I2C_M_RD) {
169		/* channel number, for read,spec required channel_num +4 */
170		ven_req.bRequest = i2c_bus->nr + 4;
171	} else
172		ven_req.bRequest = i2c_bus->nr;	/* channel number,  */
173
174	/* set index value */
175	switch (saddr_len) {
176	case 0:
177		ven_req.wIndex = 0;	/* need check */
178		break;
179	case 1:
180		ven_req.wIndex = (req_data->saddr_dat & 0xff);
181		break;
182	case 2:
183		ven_req.wIndex = req_data->saddr_dat;
184		break;
185	}
186
187	/* set wLength value */
188	ven_req.wLength = req_data->buf_size;
189
190	/* set bData value */
191	ven_req.bData = 0;
192
193	/* set the direction */
194	if (req_data->direction) {
195		ven_req.direction = USB_DIR_IN;
196		memset(req_data->p_buffer, 0x00, ven_req.wLength);
197	} else
198		ven_req.direction = USB_DIR_OUT;
199
200	/* set the buffer for read / write */
201	ven_req.pBuff = req_data->p_buffer;
202
203
204	/* call common vendor command request */
205	status = cx231xx_send_vendor_cmd(dev, &ven_req);
206	if (status < 0 && !dev->i2c_scan_running) {
207		dev_err(dev->dev, "%s: failed with status -%d\n",
208			__func__, status);
209	}
210
211	return status;
212}
213EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
214
215/*
216 * Sends/Receives URB control messages, assuring to use a kalloced buffer
217 * for all operations (dev->urb_buf), to avoid using stacked buffers, as
218 * they aren't safe for usage with USB, due to DMA restrictions.
219 * Also implements the debug code for control URB's.
220 */
221static int __usb_control_msg(struct cx231xx *dev, unsigned int pipe,
222	__u8 request, __u8 requesttype, __u16 value, __u16 index,
223	void *data, __u16 size, int timeout)
224{
225	int rc, i;
226
227	if (reg_debug) {
228		printk(KERN_DEBUG "%s: (pipe 0x%08x): %s:  %02x %02x %02x %02x %02x %02x %02x %02x ",
229				dev->name,
230				pipe,
231				(requesttype & USB_DIR_IN) ? "IN" : "OUT",
232				requesttype,
233				request,
234				value & 0xff, value >> 8,
235				index & 0xff, index >> 8,
236				size & 0xff, size >> 8);
237		if (!(requesttype & USB_DIR_IN)) {
238			printk(KERN_CONT ">>>");
239			for (i = 0; i < size; i++)
240				printk(KERN_CONT " %02x",
241				       ((unsigned char *)data)[i]);
242		}
243	}
244
245	/* Do the real call to usb_control_msg */
246	mutex_lock(&dev->ctrl_urb_lock);
247	if (!(requesttype & USB_DIR_IN) && size)
248		memcpy(dev->urb_buf, data, size);
249	rc = usb_control_msg(dev->udev, pipe, request, requesttype, value,
250			     index, dev->urb_buf, size, timeout);
251	if ((requesttype & USB_DIR_IN) && size)
252		memcpy(data, dev->urb_buf, size);
253	mutex_unlock(&dev->ctrl_urb_lock);
254
255	if (reg_debug) {
256		if (unlikely(rc < 0)) {
257			printk(KERN_CONT "FAILED!\n");
258			return rc;
259		}
260
261		if ((requesttype & USB_DIR_IN)) {
262			printk(KERN_CONT "<<<");
263			for (i = 0; i < size; i++)
264				printk(KERN_CONT " %02x",
265				       ((unsigned char *)data)[i]);
266		}
267		printk(KERN_CONT "\n");
268	}
269
270	return rc;
271}
272
273
274/*
275 * cx231xx_read_ctrl_reg()
276 * reads data from the usb device specifying bRequest and wValue
277 */
278int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
279			  char *buf, int len)
280{
281	u8 val = 0;
282	int ret;
283	int pipe = usb_rcvctrlpipe(dev->udev, 0);
284
285	if (dev->state & DEV_DISCONNECTED)
286		return -ENODEV;
287
288	if (len > URB_MAX_CTRL_SIZE)
289		return -EINVAL;
290
291	switch (len) {
292	case 1:
293		val = ENABLE_ONE_BYTE;
294		break;
295	case 2:
296		val = ENABLE_TWE_BYTE;
297		break;
298	case 3:
299		val = ENABLE_THREE_BYTE;
300		break;
301	case 4:
302		val = ENABLE_FOUR_BYTE;
303		break;
304	default:
305		val = 0xFF;	/* invalid option */
306	}
307
308	if (val == 0xFF)
309		return -EINVAL;
310
311	ret = __usb_control_msg(dev, pipe, req,
312			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
313			      val, reg, buf, len, HZ);
314	return ret;
315}
316
317int cx231xx_send_vendor_cmd(struct cx231xx *dev,
318				struct VENDOR_REQUEST_IN *ven_req)
319{
320	int ret;
321	int pipe = 0;
322	int unsend_size = 0;
323	u8 *pdata;
324
325	if (dev->state & DEV_DISCONNECTED)
326		return -ENODEV;
327
328	if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
329		return -EINVAL;
330
331	if (ven_req->direction)
332		pipe = usb_rcvctrlpipe(dev->udev, 0);
333	else
334		pipe = usb_sndctrlpipe(dev->udev, 0);
335
336	/*
337	 * If the cx23102 read more than 4 bytes with i2c bus,
338	 * need chop to 4 byte per request
339	 */
340	if ((ven_req->wLength > 4) && ((ven_req->bRequest == 0x4) ||
341					(ven_req->bRequest == 0x5) ||
342					(ven_req->bRequest == 0x6) ||
343
344					/* Internal Master 3 Bus can send
345					 * and receive only 4 bytes per time
346					 */
347					(ven_req->bRequest == 0x2))) {
348		unsend_size = 0;
349		pdata = ven_req->pBuff;
350
351
352		unsend_size = ven_req->wLength;
353
354		/* the first package */
355		ven_req->wValue = ven_req->wValue & 0xFFFB;
356		ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x2;
357		ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
358			ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
359			ven_req->wValue, ven_req->wIndex, pdata,
360			0x0004, HZ);
361		unsend_size = unsend_size - 4;
362
363		/* the middle package */
364		ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x42;
365		while (unsend_size - 4 > 0) {
366			pdata = pdata + 4;
367			ret = __usb_control_msg(dev, pipe,
368				ven_req->bRequest,
369				ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
370				ven_req->wValue, ven_req->wIndex, pdata,
371				0x0004, HZ);
372			unsend_size = unsend_size - 4;
373		}
374
375		/* the last package */
376		ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x40;
377		pdata = pdata + 4;
378		ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
379			ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
380			ven_req->wValue, ven_req->wIndex, pdata,
381			unsend_size, HZ);
382	} else {
383		ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
384				ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
385				ven_req->wValue, ven_req->wIndex,
386				ven_req->pBuff, ven_req->wLength, HZ);
387	}
388
389	return ret;
390}
391
392/*
393 * cx231xx_write_ctrl_reg()
394 * sends data to the usb device, specifying bRequest
395 */
396int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
397			   int len)
398{
399	u8 val = 0;
400	int ret;
401	int pipe = usb_sndctrlpipe(dev->udev, 0);
402
403	if (dev->state & DEV_DISCONNECTED)
404		return -ENODEV;
405
406	if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
407		return -EINVAL;
408
409	switch (len) {
410	case 1:
411		val = ENABLE_ONE_BYTE;
412		break;
413	case 2:
414		val = ENABLE_TWE_BYTE;
415		break;
416	case 3:
417		val = ENABLE_THREE_BYTE;
418		break;
419	case 4:
420		val = ENABLE_FOUR_BYTE;
421		break;
422	default:
423		val = 0xFF;	/* invalid option */
424	}
425
426	if (val == 0xFF)
427		return -EINVAL;
428
429	if (reg_debug) {
430		int byte;
431
432		cx231xx_isocdbg("(pipe 0x%08x): OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
433			pipe,
434			USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
435			req, 0, val, reg & 0xff,
436			reg >> 8, len & 0xff, len >> 8);
437
438		for (byte = 0; byte < len; byte++)
439			cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
440		cx231xx_isocdbg("\n");
441	}
442
443	ret = __usb_control_msg(dev, pipe, req,
444			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
445			      val, reg, buf, len, HZ);
446
447	return ret;
448}
449
450/****************************************************************
451*           USB Alternate Setting functions                     *
452*****************************************************************/
453
454int cx231xx_set_video_alternate(struct cx231xx *dev)
455{
456	int errCode, prev_alt = dev->video_mode.alt;
457	unsigned int min_pkt_size = dev->width * 2 + 4;
458	u32 usb_interface_index = 0;
459
460	/* When image size is bigger than a certain value,
461	   the frame size should be increased, otherwise, only
462	   green screen will be received.
463	 */
464	if (dev->width * 2 * dev->height > 720 * 240 * 2)
465		min_pkt_size *= 2;
466
467	if (dev->width > 360) {
468		/* resolutions: 720,704,640 */
469		dev->video_mode.alt = 3;
470	} else if (dev->width > 180) {
471		/* resolutions: 360,352,320,240 */
472		dev->video_mode.alt = 2;
473	} else if (dev->width > 0) {
474		/* resolutions: 180,176,160,128,88 */
475		dev->video_mode.alt = 1;
476	} else {
477		/* Change to alt0 BULK to release USB bandwidth */
478		dev->video_mode.alt = 0;
479	}
480
481	if (dev->USE_ISO == 0)
482		dev->video_mode.alt = 0;
483
484	cx231xx_coredbg("dev->video_mode.alt= %d\n", dev->video_mode.alt);
485
486	/* Get the correct video interface Index */
487	usb_interface_index =
488	    dev->current_pcb_config.hs_config_info[0].interface_info.
489	    video_index + 1;
490
491	if (dev->video_mode.alt != prev_alt) {
492		cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
493				min_pkt_size, dev->video_mode.alt);
494
495		if (dev->video_mode.alt_max_pkt_size != NULL)
496			dev->video_mode.max_pkt_size =
497			dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
498		cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
499				dev->video_mode.alt,
500				dev->video_mode.max_pkt_size);
501		errCode =
502		    usb_set_interface(dev->udev, usb_interface_index,
503				      dev->video_mode.alt);
504		if (errCode < 0) {
505			dev_err(dev->dev,
506				"cannot change alt number to %d (error=%i)\n",
507				dev->video_mode.alt, errCode);
508			return errCode;
509		}
510	}
511	return 0;
512}
513
514int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
515{
516	int status = 0;
517	u32 usb_interface_index = 0;
518	u32 max_pkt_size = 0;
519
520	switch (index) {
521	case INDEX_TS1:
522		usb_interface_index =
523		    dev->current_pcb_config.hs_config_info[0].interface_info.
524		    ts1_index + 1;
525		dev->ts1_mode.alt = alt;
526		if (dev->ts1_mode.alt_max_pkt_size != NULL)
527			max_pkt_size = dev->ts1_mode.max_pkt_size =
528			    dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
529		break;
530	case INDEX_TS2:
531		usb_interface_index =
532		    dev->current_pcb_config.hs_config_info[0].interface_info.
533		    ts2_index + 1;
534		break;
535	case INDEX_AUDIO:
536		usb_interface_index =
537		    dev->current_pcb_config.hs_config_info[0].interface_info.
538		    audio_index + 1;
539		dev->adev.alt = alt;
540		if (dev->adev.alt_max_pkt_size != NULL)
541			max_pkt_size = dev->adev.max_pkt_size =
542			    dev->adev.alt_max_pkt_size[dev->adev.alt];
543		break;
544	case INDEX_VIDEO:
545		usb_interface_index =
546		    dev->current_pcb_config.hs_config_info[0].interface_info.
547		    video_index + 1;
548		dev->video_mode.alt = alt;
549		if (dev->video_mode.alt_max_pkt_size != NULL)
550			max_pkt_size = dev->video_mode.max_pkt_size =
551			    dev->video_mode.alt_max_pkt_size[dev->video_mode.
552							     alt];
553		break;
554	case INDEX_VANC:
555		if (dev->board.no_alt_vanc)
556			return 0;
557		usb_interface_index =
558		    dev->current_pcb_config.hs_config_info[0].interface_info.
559		    vanc_index + 1;
560		dev->vbi_mode.alt = alt;
561		if (dev->vbi_mode.alt_max_pkt_size != NULL)
562			max_pkt_size = dev->vbi_mode.max_pkt_size =
563			    dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
564		break;
565	case INDEX_HANC:
566		usb_interface_index =
567		    dev->current_pcb_config.hs_config_info[0].interface_info.
568		    hanc_index + 1;
569		dev->sliced_cc_mode.alt = alt;
570		if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
571			max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
572			    dev->sliced_cc_mode.alt_max_pkt_size[dev->
573								 sliced_cc_mode.
574								 alt];
575		break;
576	default:
577		break;
578	}
579
580	if (alt > 0 && max_pkt_size == 0) {
581		dev_err(dev->dev,
582			"can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
583			usb_interface_index, alt);
584		/*To workaround error number=-71 on EP0 for videograbber,
585		 need add following codes.*/
586		if (dev->board.no_alt_vanc)
587			return -1;
588	}
589
590	cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u,Interface = %d\n",
591			alt, max_pkt_size,
592			usb_interface_index);
593
594	if (usb_interface_index > 0) {
595		status = usb_set_interface(dev->udev, usb_interface_index, alt);
596		if (status < 0) {
597			dev_err(dev->dev,
598				"can't change interface %d alt no. to %d (err=%i)\n",
599				usb_interface_index, alt, status);
600			return status;
601		}
602	}
603
604	return status;
605}
606EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
607
608int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
609{
610	int rc = 0;
611
612	if (!gpio)
613		return rc;
614
615	/* Send GPIO reset sequences specified at board entry */
616	while (gpio->sleep >= 0) {
617		rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
618		if (rc < 0)
619			return rc;
620
621		if (gpio->sleep > 0)
622			msleep(gpio->sleep);
623
624		gpio++;
625	}
626	return rc;
627}
628
629int cx231xx_demod_reset(struct cx231xx *dev)
630{
631
632	u8 status = 0;
633	u8 value[4] = { 0, 0, 0, 0 };
634
635	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
636				 value, 4);
637
638	cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
639			value[0], value[1], value[2], value[3]);
640
641	cx231xx_coredbg("Enter cx231xx_demod_reset()\n");
642
643	value[1] = (u8) 0x3;
644	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
645					PWR_CTL_EN, value, 4);
646	msleep(10);
647
648	value[1] = (u8) 0x0;
649	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
650					PWR_CTL_EN, value, 4);
651	msleep(10);
652
653	value[1] = (u8) 0x3;
654	status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
655					PWR_CTL_EN, value, 4);
656	msleep(10);
657
658	status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
659				 value, 4);
660
661	cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
662			value[0], value[1], value[2], value[3]);
663
664	return status;
665}
666EXPORT_SYMBOL_GPL(cx231xx_demod_reset);
667int is_fw_load(struct cx231xx *dev)
668{
669	return cx231xx_check_fw(dev);
670}
671EXPORT_SYMBOL_GPL(is_fw_load);
672
673int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
674{
675	int errCode = 0;
676
677	if (dev->mode == set_mode)
678		return 0;
679
680	if (set_mode == CX231XX_SUSPEND) {
681		/* Set the chip in power saving mode */
682		dev->mode = set_mode;
683	}
684
685	/* Resource is locked */
686	if (dev->mode != CX231XX_SUSPEND)
687		return -EINVAL;
688
689	dev->mode = set_mode;
690
691	if (dev->mode == CX231XX_DIGITAL_MODE)/* Set Digital power mode */ {
692	/* set AGC mode to Digital */
693		switch (dev->model) {
694		case CX231XX_BOARD_CNXT_CARRAERA:
695		case CX231XX_BOARD_CNXT_RDE_250:
696		case CX231XX_BOARD_CNXT_SHELBY:
697		case CX231XX_BOARD_CNXT_RDU_250:
698		errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
699			break;
700		case CX231XX_BOARD_CNXT_RDE_253S:
701		case CX231XX_BOARD_CNXT_RDU_253S:
702		case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
703			errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
704			break;
705		case CX231XX_BOARD_HAUPPAUGE_EXETER:
706		case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
707			errCode = cx231xx_set_power_mode(dev,
708						POLARIS_AVMODE_DIGITAL);
709			break;
710		default:
711			break;
712		}
713	} else/* Set Analog Power mode */ {
714	/* set AGC mode to Analog */
715		switch (dev->model) {
716		case CX231XX_BOARD_CNXT_CARRAERA:
717		case CX231XX_BOARD_CNXT_RDE_250:
718		case CX231XX_BOARD_CNXT_SHELBY:
719		case CX231XX_BOARD_CNXT_RDU_250:
720		errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
721			break;
722		case CX231XX_BOARD_CNXT_RDE_253S:
723		case CX231XX_BOARD_CNXT_RDU_253S:
724		case CX231XX_BOARD_HAUPPAUGE_EXETER:
725		case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
726		case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
727		case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
728		case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
729			errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
730			break;
731		default:
732			break;
733		}
734	}
735
736	if (errCode < 0) {
737		dev_err(dev->dev, "Failed to set devmode to %s: error: %i",
738			dev->mode == CX231XX_DIGITAL_MODE ? "digital" : "analog",
739			errCode);
740		return errCode;
741	}
742
743	return 0;
744}
745EXPORT_SYMBOL_GPL(cx231xx_set_mode);
746
747int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size)
748{
749	int errCode = 0;
750	int actlen = -1;
751	int ret = -ENOMEM;
752	u32 *buffer;
753
754	buffer = kmemdup(firmware, EP5_BUF_SIZE, GFP_KERNEL);
755	if (buffer == NULL)
756		return -ENOMEM;
757
758	ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 5),
759			buffer, EP5_BUF_SIZE, &actlen, EP5_TIMEOUT_MS);
760
761	if (ret)
762		dev_err(dev->dev,
763			"bulk message failed: %d (%d/%d)", ret,
764			size, actlen);
765	else {
766		errCode = actlen != size ? -1 : 0;
767	}
768	kfree(buffer);
769	return errCode;
770}
771
772/*****************************************************************
773*                URB Streaming functions                         *
774******************************************************************/
775
776/*
777 * IRQ callback, called by URB callback
778 */
779static void cx231xx_isoc_irq_callback(struct urb *urb)
780{
781	struct cx231xx_dmaqueue *dma_q = urb->context;
782	struct cx231xx_video_mode *vmode =
783	    container_of(dma_q, struct cx231xx_video_mode, vidq);
784	struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
785	unsigned long flags;
786	int i;
787
788	switch (urb->status) {
789	case 0:		/* success */
790	case -ETIMEDOUT:	/* NAK */
791		break;
792	case -ECONNRESET:	/* kill */
793	case -ENOENT:
794	case -ESHUTDOWN:
795		return;
796	default:		/* error */
797		cx231xx_isocdbg("urb completion error %d.\n", urb->status);
798		break;
799	}
800
801	/* Copy data from URB */
802	spin_lock_irqsave(&dev->video_mode.slock, flags);
803	dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
804	spin_unlock_irqrestore(&dev->video_mode.slock, flags);
805
806	/* Reset urb buffers */
807	for (i = 0; i < urb->number_of_packets; i++) {
808		urb->iso_frame_desc[i].status = 0;
809		urb->iso_frame_desc[i].actual_length = 0;
810	}
811
812	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
813	if (urb->status) {
814		cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
815				urb->status);
816	}
817}
818/*****************************************************************
819*                URB Streaming functions                         *
820******************************************************************/
821
822/*
823 * IRQ callback, called by URB callback
824 */
825static void cx231xx_bulk_irq_callback(struct urb *urb)
826{
827	struct cx231xx_dmaqueue *dma_q = urb->context;
828	struct cx231xx_video_mode *vmode =
829	    container_of(dma_q, struct cx231xx_video_mode, vidq);
830	struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
831	unsigned long flags;
832
833	switch (urb->status) {
834	case 0:		/* success */
835	case -ETIMEDOUT:	/* NAK */
836		break;
837	case -ECONNRESET:	/* kill */
838	case -ENOENT:
839	case -ESHUTDOWN:
840		return;
841	case -EPIPE:		/* stall */
842		cx231xx_isocdbg("urb completion error - device is stalled.\n");
843		return;
844	default:		/* error */
845		cx231xx_isocdbg("urb completion error %d.\n", urb->status);
846		break;
847	}
848
849	/* Copy data from URB */
850	spin_lock_irqsave(&dev->video_mode.slock, flags);
851	dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
852	spin_unlock_irqrestore(&dev->video_mode.slock, flags);
853
854	/* Reset urb buffers */
855	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
856	if (urb->status) {
857		cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
858				urb->status);
859	}
860}
861/*
862 * Stop and Deallocate URBs
863 */
864void cx231xx_uninit_isoc(struct cx231xx *dev)
865{
866	struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
867	struct urb *urb;
868	int i;
869	bool broken_pipe = false;
870
871	cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
872
873	dev->video_mode.isoc_ctl.nfields = -1;
874	for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
875		urb = dev->video_mode.isoc_ctl.urb[i];
876		if (urb) {
877			if (!irqs_disabled())
878				usb_kill_urb(urb);
879			else
880				usb_unlink_urb(urb);
881
882			if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
883				usb_free_coherent(dev->udev,
884						  urb->transfer_buffer_length,
885						  dev->video_mode.isoc_ctl.
886						  transfer_buffer[i],
887						  urb->transfer_dma);
888			}
889			if (urb->status == -EPIPE) {
890				broken_pipe = true;
891			}
892			usb_free_urb(urb);
893			dev->video_mode.isoc_ctl.urb[i] = NULL;
894		}
895		dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
896	}
897
898	if (broken_pipe) {
899		cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
900		usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
901	}
902	kfree(dev->video_mode.isoc_ctl.urb);
903	kfree(dev->video_mode.isoc_ctl.transfer_buffer);
904	kfree(dma_q->p_left_data);
905
906	dev->video_mode.isoc_ctl.urb = NULL;
907	dev->video_mode.isoc_ctl.transfer_buffer = NULL;
908	dev->video_mode.isoc_ctl.num_bufs = 0;
909	dma_q->p_left_data = NULL;
910
911	if (dev->mode_tv == 0)
912		cx231xx_capture_start(dev, 0, Raw_Video);
913	else
914		cx231xx_capture_start(dev, 0, TS1_serial_mode);
915
916
917}
918EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
919
920/*
921 * Stop and Deallocate URBs
922 */
923void cx231xx_uninit_bulk(struct cx231xx *dev)
924{
925	struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
926	struct urb *urb;
927	int i;
928	bool broken_pipe = false;
929
930	cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
931
932	dev->video_mode.bulk_ctl.nfields = -1;
933	for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
934		urb = dev->video_mode.bulk_ctl.urb[i];
935		if (urb) {
936			if (!irqs_disabled())
937				usb_kill_urb(urb);
938			else
939				usb_unlink_urb(urb);
940
941			if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
942				usb_free_coherent(dev->udev,
943						urb->transfer_buffer_length,
944						dev->video_mode.bulk_ctl.
945						transfer_buffer[i],
946						urb->transfer_dma);
947			}
948			if (urb->status == -EPIPE) {
949				broken_pipe = true;
950			}
951			usb_free_urb(urb);
952			dev->video_mode.bulk_ctl.urb[i] = NULL;
953		}
954		dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
955	}
956
957	if (broken_pipe) {
958		cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
959		usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
960	}
961	kfree(dev->video_mode.bulk_ctl.urb);
962	kfree(dev->video_mode.bulk_ctl.transfer_buffer);
963	kfree(dma_q->p_left_data);
964
965	dev->video_mode.bulk_ctl.urb = NULL;
966	dev->video_mode.bulk_ctl.transfer_buffer = NULL;
967	dev->video_mode.bulk_ctl.num_bufs = 0;
968	dma_q->p_left_data = NULL;
969
970	if (dev->mode_tv == 0)
971		cx231xx_capture_start(dev, 0, Raw_Video);
972	else
973		cx231xx_capture_start(dev, 0, TS1_serial_mode);
974
975
976}
977EXPORT_SYMBOL_GPL(cx231xx_uninit_bulk);
978
979/*
980 * Allocate URBs and start IRQ
981 */
982int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
983		      int num_bufs, int max_pkt_size,
984		      int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
985{
986	struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
987	int i;
988	int sb_size, pipe;
989	struct urb *urb;
990	int j, k;
991	int rc;
992
993	/* De-allocates all pending stuff */
994	cx231xx_uninit_isoc(dev);
995
996	dma_q->p_left_data = kzalloc(EP5_BUF_SIZE, GFP_KERNEL);
997	if (dma_q->p_left_data == NULL)
998		return -ENOMEM;
999
1000	dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
1001	dev->video_mode.isoc_ctl.num_bufs = num_bufs;
1002	dma_q->pos = 0;
1003	dma_q->is_partial_line = 0;
1004	dma_q->last_sav = 0;
1005	dma_q->current_field = -1;
1006	dma_q->field1_done = 0;
1007	dma_q->lines_per_field = dev->height / 2;
1008	dma_q->bytes_left_in_line = dev->width << 1;
1009	dma_q->lines_completed = 0;
1010	dma_q->mpeg_buffer_done = 0;
1011	dma_q->left_data_count = 0;
1012	dma_q->mpeg_buffer_completed = 0;
1013	dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
1014	dma_q->ps_head[0] = 0x00;
1015	dma_q->ps_head[1] = 0x00;
1016	dma_q->ps_head[2] = 0x01;
1017	dma_q->ps_head[3] = 0xBA;
1018	for (i = 0; i < 8; i++)
1019		dma_q->partial_buf[i] = 0;
1020
1021	dev->video_mode.isoc_ctl.urb =
1022	    kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1023	if (!dev->video_mode.isoc_ctl.urb) {
1024		dev_err(dev->dev,
1025			"cannot alloc memory for usb buffers\n");
1026		kfree(dma_q->p_left_data);
1027		return -ENOMEM;
1028	}
1029
1030	dev->video_mode.isoc_ctl.transfer_buffer =
1031	    kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1032	if (!dev->video_mode.isoc_ctl.transfer_buffer) {
1033		dev_err(dev->dev,
1034			"cannot allocate memory for usbtransfer\n");
1035		kfree(dev->video_mode.isoc_ctl.urb);
1036		kfree(dma_q->p_left_data);
1037		return -ENOMEM;
1038	}
1039
1040	dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
1041	dev->video_mode.isoc_ctl.buf = NULL;
1042
1043	sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
1044
1045	if (dev->mode_tv == 1)
1046		dev->video_mode.end_point_addr = 0x81;
1047	else
1048		dev->video_mode.end_point_addr = 0x84;
1049
1050
1051	/* allocate urbs and transfer buffers */
1052	for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1053		urb = usb_alloc_urb(max_packets, GFP_KERNEL);
1054		if (!urb) {
1055			cx231xx_uninit_isoc(dev);
1056			return -ENOMEM;
1057		}
1058		dev->video_mode.isoc_ctl.urb[i] = urb;
1059
1060		dev->video_mode.isoc_ctl.transfer_buffer[i] =
1061		    usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1062				       &urb->transfer_dma);
1063		if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
1064			dev_err(dev->dev,
1065				"unable to allocate %i bytes for transfer buffer %i\n",
1066				sb_size, i);
1067			cx231xx_uninit_isoc(dev);
1068			return -ENOMEM;
1069		}
1070		memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
1071
1072		pipe =
1073		    usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
1074
1075		usb_fill_int_urb(urb, dev->udev, pipe,
1076				 dev->video_mode.isoc_ctl.transfer_buffer[i],
1077				 sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
1078
1079		urb->number_of_packets = max_packets;
1080		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
1081
1082		k = 0;
1083		for (j = 0; j < max_packets; j++) {
1084			urb->iso_frame_desc[j].offset = k;
1085			urb->iso_frame_desc[j].length =
1086			    dev->video_mode.isoc_ctl.max_pkt_size;
1087			k += dev->video_mode.isoc_ctl.max_pkt_size;
1088		}
1089	}
1090
1091	init_waitqueue_head(&dma_q->wq);
1092
1093	/* submit urbs and enables IRQ */
1094	for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1095		rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
1096				    GFP_ATOMIC);
1097		if (rc) {
1098			dev_err(dev->dev,
1099				"submit of urb %i failed (error=%i)\n", i,
1100				rc);
1101			cx231xx_uninit_isoc(dev);
1102			return rc;
1103		}
1104	}
1105
1106	if (dev->mode_tv == 0)
1107		cx231xx_capture_start(dev, 1, Raw_Video);
1108	else
1109		cx231xx_capture_start(dev, 1, TS1_serial_mode);
1110
1111	return 0;
1112}
1113EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
1114
1115/*
1116 * Allocate URBs and start IRQ
1117 */
1118int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
1119		      int num_bufs, int max_pkt_size,
1120		      int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
1121{
1122	struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1123	int i;
1124	int sb_size, pipe;
1125	struct urb *urb;
1126	int rc;
1127
1128	dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1129
1130	cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1131
1132	video_mux(dev, dev->video_input);
1133
1134	/* De-allocates all pending stuff */
1135	cx231xx_uninit_bulk(dev);
1136
1137	dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
1138	dev->video_mode.bulk_ctl.num_bufs = num_bufs;
1139	dma_q->pos = 0;
1140	dma_q->is_partial_line = 0;
1141	dma_q->last_sav = 0;
1142	dma_q->current_field = -1;
1143	dma_q->field1_done = 0;
1144	dma_q->lines_per_field = dev->height / 2;
1145	dma_q->bytes_left_in_line = dev->width << 1;
1146	dma_q->lines_completed = 0;
1147	dma_q->mpeg_buffer_done = 0;
1148	dma_q->left_data_count = 0;
1149	dma_q->mpeg_buffer_completed = 0;
1150	dma_q->ps_head[0] = 0x00;
1151	dma_q->ps_head[1] = 0x00;
1152	dma_q->ps_head[2] = 0x01;
1153	dma_q->ps_head[3] = 0xBA;
1154	for (i = 0; i < 8; i++)
1155		dma_q->partial_buf[i] = 0;
1156
1157	dev->video_mode.bulk_ctl.urb =
1158	    kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1159	if (!dev->video_mode.bulk_ctl.urb) {
1160		dev_err(dev->dev,
1161			"cannot alloc memory for usb buffers\n");
1162		return -ENOMEM;
1163	}
1164
1165	dev->video_mode.bulk_ctl.transfer_buffer =
1166	    kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1167	if (!dev->video_mode.bulk_ctl.transfer_buffer) {
1168		dev_err(dev->dev,
1169			"cannot allocate memory for usbtransfer\n");
1170		kfree(dev->video_mode.bulk_ctl.urb);
1171		return -ENOMEM;
1172	}
1173
1174	dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
1175	dev->video_mode.bulk_ctl.buf = NULL;
1176
1177	sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
1178
1179	if (dev->mode_tv == 1)
1180		dev->video_mode.end_point_addr = 0x81;
1181	else
1182		dev->video_mode.end_point_addr = 0x84;
1183
1184
1185	/* allocate urbs and transfer buffers */
1186	for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1187		urb = usb_alloc_urb(0, GFP_KERNEL);
1188		if (!urb) {
1189			cx231xx_uninit_bulk(dev);
1190			return -ENOMEM;
1191		}
1192		dev->video_mode.bulk_ctl.urb[i] = urb;
1193		urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
1194
1195		dev->video_mode.bulk_ctl.transfer_buffer[i] =
1196		    usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1197				     &urb->transfer_dma);
1198		if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
1199			dev_err(dev->dev,
1200				"unable to allocate %i bytes for transfer buffer %i\n",
1201				sb_size, i);
1202			cx231xx_uninit_bulk(dev);
1203			return -ENOMEM;
1204		}
1205		memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
1206
1207		pipe = usb_rcvbulkpipe(dev->udev,
1208				 dev->video_mode.end_point_addr);
1209		usb_fill_bulk_urb(urb, dev->udev, pipe,
1210				  dev->video_mode.bulk_ctl.transfer_buffer[i],
1211				  sb_size, cx231xx_bulk_irq_callback, dma_q);
1212	}
1213
1214	/* clear halt */
1215	rc = usb_clear_halt(dev->udev, dev->video_mode.bulk_ctl.urb[0]->pipe);
1216	if (rc < 0) {
1217		dev_err(dev->dev,
1218			"failed to clear USB bulk endpoint stall/halt condition (error=%i)\n",
1219			rc);
1220		cx231xx_uninit_bulk(dev);
1221		return rc;
1222	}
1223
1224	init_waitqueue_head(&dma_q->wq);
1225
1226	/* submit urbs and enables IRQ */
1227	for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1228		rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
1229				    GFP_ATOMIC);
1230		if (rc) {
1231			dev_err(dev->dev,
1232				"submit of urb %i failed (error=%i)\n", i, rc);
1233			cx231xx_uninit_bulk(dev);
1234			return rc;
1235		}
1236	}
1237
1238	if (dev->mode_tv == 0)
1239		cx231xx_capture_start(dev, 1, Raw_Video);
1240	else
1241		cx231xx_capture_start(dev, 1, TS1_serial_mode);
1242
1243	return 0;
1244}
1245EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
1246void cx231xx_stop_TS1(struct cx231xx *dev)
1247{
1248	u8 val[4] = { 0, 0, 0, 0 };
1249
1250	val[0] = 0x00;
1251	val[1] = 0x03;
1252	val[2] = 0x00;
1253	val[3] = 0x00;
1254	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1255			TS_MODE_REG, val, 4);
1256
1257	val[0] = 0x00;
1258	val[1] = 0x70;
1259	val[2] = 0x04;
1260	val[3] = 0x00;
1261	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1262			TS1_CFG_REG, val, 4);
1263}
1264/* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
1265void cx231xx_start_TS1(struct cx231xx *dev)
1266{
1267	u8 val[4] = { 0, 0, 0, 0 };
1268
1269	val[0] = 0x03;
1270	val[1] = 0x03;
1271	val[2] = 0x00;
1272	val[3] = 0x00;
1273	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1274			TS_MODE_REG, val, 4);
1275
1276	val[0] = 0x04;
1277	val[1] = 0xA3;
1278	val[2] = 0x3B;
1279	val[3] = 0x00;
1280	cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1281			TS1_CFG_REG, val, 4);
1282}
1283/* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
1284/*****************************************************************
1285*             Device Init/UnInit functions                       *
1286******************************************************************/
1287int cx231xx_dev_init(struct cx231xx *dev)
1288{
1289	int errCode = 0;
1290
1291	/* Initialize I2C bus */
1292
1293	/* External Master 1 Bus */
1294	dev->i2c_bus[0].nr = 0;
1295	dev->i2c_bus[0].dev = dev;
1296	dev->i2c_bus[0].i2c_period = I2C_SPEED_100K;	/* 100 KHz */
1297	dev->i2c_bus[0].i2c_nostop = 0;
1298	dev->i2c_bus[0].i2c_reserve = 0;
1299	dev->i2c_bus[0].i2c_rc = -ENODEV;
1300
1301	/* External Master 2 Bus */
1302	dev->i2c_bus[1].nr = 1;
1303	dev->i2c_bus[1].dev = dev;
1304	dev->i2c_bus[1].i2c_period = I2C_SPEED_100K;	/* 100 KHz */
1305	dev->i2c_bus[1].i2c_nostop = 0;
1306	dev->i2c_bus[1].i2c_reserve = 0;
1307	dev->i2c_bus[1].i2c_rc = -ENODEV;
1308
1309	/* Internal Master 3 Bus */
1310	dev->i2c_bus[2].nr = 2;
1311	dev->i2c_bus[2].dev = dev;
1312	dev->i2c_bus[2].i2c_period = I2C_SPEED_100K;	/* 100kHz */
1313	dev->i2c_bus[2].i2c_nostop = 0;
1314	dev->i2c_bus[2].i2c_reserve = 0;
1315	dev->i2c_bus[2].i2c_rc = -ENODEV;
1316
1317	/* register I2C buses */
1318	errCode = cx231xx_i2c_register(&dev->i2c_bus[0]);
1319	if (errCode < 0)
1320		return errCode;
1321	errCode = cx231xx_i2c_register(&dev->i2c_bus[1]);
1322	if (errCode < 0)
1323		return errCode;
1324	errCode = cx231xx_i2c_register(&dev->i2c_bus[2]);
1325	if (errCode < 0)
1326		return errCode;
1327
1328	errCode = cx231xx_i2c_mux_create(dev);
1329	if (errCode < 0) {
1330		dev_err(dev->dev,
1331			"%s: Failed to create I2C mux\n", __func__);
1332		return errCode;
1333	}
1334	errCode = cx231xx_i2c_mux_register(dev, 0);
1335	if (errCode < 0)
1336		return errCode;
1337
1338	errCode = cx231xx_i2c_mux_register(dev, 1);
1339	if (errCode < 0)
1340		return errCode;
1341
1342	/* scan the real bus segments in the order of physical port numbers */
1343	cx231xx_do_i2c_scan(dev, I2C_0);
1344	cx231xx_do_i2c_scan(dev, I2C_1_MUX_1);
1345	cx231xx_do_i2c_scan(dev, I2C_2);
1346	cx231xx_do_i2c_scan(dev, I2C_1_MUX_3);
1347
1348	/* init hardware */
1349	/* Note : with out calling set power mode function,
1350	afe can not be set up correctly */
1351	if (dev->board.external_av) {
1352		errCode = cx231xx_set_power_mode(dev,
1353				 POLARIS_AVMODE_ENXTERNAL_AV);
1354		if (errCode < 0) {
1355			dev_err(dev->dev,
1356				"%s: Failed to set Power - errCode [%d]!\n",
1357				__func__, errCode);
1358			return errCode;
1359		}
1360	} else {
1361		errCode = cx231xx_set_power_mode(dev,
1362				 POLARIS_AVMODE_ANALOGT_TV);
1363		if (errCode < 0) {
1364			dev_err(dev->dev,
1365				"%s: Failed to set Power - errCode [%d]!\n",
1366				__func__, errCode);
1367			return errCode;
1368		}
1369	}
1370
1371	/* reset the Tuner, if it is a Xceive tuner */
1372	if ((dev->board.tuner_type == TUNER_XC5000) ||
1373	    (dev->board.tuner_type == TUNER_XC2028))
1374			cx231xx_gpio_set(dev, dev->board.tuner_gpio);
1375
1376	/* initialize Colibri block */
1377	errCode = cx231xx_afe_init_super_block(dev, 0x23c);
1378	if (errCode < 0) {
1379		dev_err(dev->dev,
1380			"%s: cx231xx_afe init super block - errCode [%d]!\n",
1381			__func__, errCode);
1382		return errCode;
1383	}
1384	errCode = cx231xx_afe_init_channels(dev);
1385	if (errCode < 0) {
1386		dev_err(dev->dev,
1387			"%s: cx231xx_afe init channels - errCode [%d]!\n",
1388			__func__, errCode);
1389		return errCode;
1390	}
1391
1392	/* Set DIF in By pass mode */
1393	errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
1394	if (errCode < 0) {
1395		dev_err(dev->dev,
1396			"%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
1397			__func__, errCode);
1398		return errCode;
1399	}
1400
1401	/* I2S block related functions */
1402	errCode = cx231xx_i2s_blk_initialize(dev);
1403	if (errCode < 0) {
1404		dev_err(dev->dev,
1405			"%s: cx231xx_i2s block initialize - errCode [%d]!\n",
1406			__func__, errCode);
1407		return errCode;
1408	}
1409
1410	/* init control pins */
1411	errCode = cx231xx_init_ctrl_pin_status(dev);
1412	if (errCode < 0) {
1413		dev_err(dev->dev,
1414			"%s: cx231xx_init ctrl pins - errCode [%d]!\n",
1415			__func__, errCode);
1416		return errCode;
1417	}
1418
1419	/* set AGC mode to Analog */
1420	switch (dev->model) {
1421	case CX231XX_BOARD_CNXT_CARRAERA:
1422	case CX231XX_BOARD_CNXT_RDE_250:
1423	case CX231XX_BOARD_CNXT_SHELBY:
1424	case CX231XX_BOARD_CNXT_RDU_250:
1425	errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
1426		break;
1427	case CX231XX_BOARD_CNXT_RDE_253S:
1428	case CX231XX_BOARD_CNXT_RDU_253S:
1429	case CX231XX_BOARD_HAUPPAUGE_EXETER:
1430	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1431	case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
1432	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
1433	case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
1434	errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1435		break;
1436	default:
1437		break;
1438	}
1439	if (errCode < 0) {
1440		dev_err(dev->dev,
1441			"%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
1442			__func__, errCode);
1443		return errCode;
1444	}
1445
1446	/* set all alternate settings to zero initially */
1447	cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1448	cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1449	cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1450	if (dev->board.has_dvb)
1451		cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
1452
1453	errCode = 0;
1454	return errCode;
1455}
1456EXPORT_SYMBOL_GPL(cx231xx_dev_init);
1457
1458void cx231xx_dev_uninit(struct cx231xx *dev)
1459{
1460	/* Un Initialize I2C bus */
1461	cx231xx_i2c_mux_unregister(dev);
1462	cx231xx_i2c_unregister(&dev->i2c_bus[2]);
1463	cx231xx_i2c_unregister(&dev->i2c_bus[1]);
1464	cx231xx_i2c_unregister(&dev->i2c_bus[0]);
1465}
1466EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
1467
1468/*****************************************************************
1469*              G P I O related functions                         *
1470******************************************************************/
1471int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
1472			  u8 len, u8 request, u8 direction)
1473{
1474	int status = 0;
1475	struct VENDOR_REQUEST_IN ven_req;
1476
1477	/* Set wValue */
1478	ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
1479
1480	/* set request */
1481	if (!request) {
1482		if (direction)
1483			ven_req.bRequest = VRT_GET_GPIO;	/* 0x9 gpio */
1484		else
1485			ven_req.bRequest = VRT_SET_GPIO;	/* 0x8 gpio */
1486	} else {
1487		if (direction)
1488			ven_req.bRequest = VRT_GET_GPIE;	/* 0xb gpie */
1489		else
1490			ven_req.bRequest = VRT_SET_GPIE;	/* 0xa gpie */
1491	}
1492
1493	/* set index value */
1494	ven_req.wIndex = (u16) (gpio_bit & 0xffff);
1495
1496	/* set wLength value */
1497	ven_req.wLength = len;
1498
1499	/* set bData value */
1500	ven_req.bData = 0;
1501
1502	/* set the buffer for read / write */
1503	ven_req.pBuff = gpio_val;
1504
1505	/* set the direction */
1506	if (direction) {
1507		ven_req.direction = USB_DIR_IN;
1508		memset(ven_req.pBuff, 0x00, ven_req.wLength);
1509	} else
1510		ven_req.direction = USB_DIR_OUT;
1511
1512
1513	/* call common vendor command request */
1514	status = cx231xx_send_vendor_cmd(dev, &ven_req);
1515	if (status < 0) {
1516		dev_err(dev->dev, "%s: failed with status -%d\n",
1517			__func__, status);
1518	}
1519
1520	return status;
1521}
1522EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
1523
1524/*****************************************************************
1525 *    C O N T R O L - Register R E A D / W R I T E functions     *
1526 *****************************************************************/
1527int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1528{
1529	u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
1530	u32 tmp = 0;
1531	int status = 0;
1532
1533	status =
1534	    cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
1535	if (status < 0)
1536		return status;
1537
1538	tmp = le32_to_cpu(*((__le32 *) value));
1539	tmp |= mode;
1540
1541	value[0] = (u8) tmp;
1542	value[1] = (u8) (tmp >> 8);
1543	value[2] = (u8) (tmp >> 16);
1544	value[3] = (u8) (tmp >> 24);
1545
1546	status =
1547	    cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
1548
1549	return status;
1550}
1551
1552/*****************************************************************
1553 *            I 2 C Internal C O N T R O L   functions           *
1554 *****************************************************************/
1555int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1556			  u8 saddr_len, u32 *data, u8 data_len, int master)
1557{
1558	int status = 0;
1559	struct cx231xx_i2c_xfer_data req_data;
1560	u8 value[64] = "0";
1561
1562	if (saddr_len == 0)
1563		saddr = 0;
1564	else if (saddr_len == 1)
1565		saddr &= 0xff;
1566
1567	/* prepare xfer_data struct */
1568	req_data.dev_addr = dev_addr >> 1;
1569	req_data.direction = I2C_M_RD;
1570	req_data.saddr_len = saddr_len;
1571	req_data.saddr_dat = saddr;
1572	req_data.buf_size = data_len;
1573	req_data.p_buffer = (u8 *) value;
1574
1575	/* usb send command */
1576	if (master == 0)
1577		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1578					 &req_data);
1579	else if (master == 1)
1580		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1581					 &req_data);
1582	else if (master == 2)
1583		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1584					 &req_data);
1585
1586	if (status >= 0) {
1587		/* Copy the data read back to main buffer */
1588		if (data_len == 1)
1589			*data = value[0];
1590		else if (data_len == 4)
1591			*data =
1592			    value[0] | value[1] << 8 | value[2] << 16 | value[3]
1593			    << 24;
1594		else if (data_len > 4)
1595			*data = value[saddr];
1596	}
1597
1598	return status;
1599}
1600
1601int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1602			   u8 saddr_len, u32 data, u8 data_len, int master)
1603{
1604	int status = 0;
1605	u8 value[4] = { 0, 0, 0, 0 };
1606	struct cx231xx_i2c_xfer_data req_data;
1607
1608	value[0] = (u8) data;
1609	value[1] = (u8) (data >> 8);
1610	value[2] = (u8) (data >> 16);
1611	value[3] = (u8) (data >> 24);
1612
1613	if (saddr_len == 0)
1614		saddr = 0;
1615	else if (saddr_len == 1)
1616		saddr &= 0xff;
1617
1618	/* prepare xfer_data struct */
1619	req_data.dev_addr = dev_addr >> 1;
1620	req_data.direction = 0;
1621	req_data.saddr_len = saddr_len;
1622	req_data.saddr_dat = saddr;
1623	req_data.buf_size = data_len;
1624	req_data.p_buffer = value;
1625
1626	/* usb send command */
1627	if (master == 0)
1628		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1629				 &req_data);
1630	else if (master == 1)
1631		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1632				 &req_data);
1633	else if (master == 2)
1634		status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1635				 &req_data);
1636
1637	return status;
1638}
1639
1640int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1641			  u8 saddr_len, u32 *data, u8 data_len)
1642{
1643	int status = 0;
1644	struct cx231xx_i2c_xfer_data req_data;
1645	u8 value[4] = { 0, 0, 0, 0 };
1646
1647	if (saddr_len == 0)
1648		saddr = 0;
1649	else if (saddr_len == 1)
1650		saddr &= 0xff;
1651
1652	/* prepare xfer_data struct */
1653	req_data.dev_addr = dev_addr >> 1;
1654	req_data.direction = I2C_M_RD;
1655	req_data.saddr_len = saddr_len;
1656	req_data.saddr_dat = saddr;
1657	req_data.buf_size = data_len;
1658	req_data.p_buffer = (u8 *) value;
1659
1660	/* usb send command */
1661	status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1662
1663	if (status >= 0) {
1664		/* Copy the data read back to main buffer */
1665		if (data_len == 1)
1666			*data = value[0];
1667		else
1668			*data =
1669			    value[0] | value[1] << 8 | value[2] << 16 | value[3]
1670			    << 24;
1671	}
1672
1673	return status;
1674}
1675
1676int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1677			   u8 saddr_len, u32 data, u8 data_len)
1678{
1679	int status = 0;
1680	u8 value[4] = { 0, 0, 0, 0 };
1681	struct cx231xx_i2c_xfer_data req_data;
1682
1683	value[0] = (u8) data;
1684	value[1] = (u8) (data >> 8);
1685	value[2] = (u8) (data >> 16);
1686	value[3] = (u8) (data >> 24);
1687
1688	if (saddr_len == 0)
1689		saddr = 0;
1690	else if (saddr_len == 1)
1691		saddr &= 0xff;
1692
1693	/* prepare xfer_data struct */
1694	req_data.dev_addr = dev_addr >> 1;
1695	req_data.direction = 0;
1696	req_data.saddr_len = saddr_len;
1697	req_data.saddr_dat = saddr;
1698	req_data.buf_size = data_len;
1699	req_data.p_buffer = value;
1700
1701	/* usb send command */
1702	status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1703
1704	return status;
1705}
1706
1707int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
1708			   u16 register_address, u8 bit_start, u8 bit_end,
1709			   u32 value)
1710{
1711	int status = 0;
1712	u32 tmp;
1713	u32 mask = 0;
1714	int i;
1715
1716	if (bit_start > (size - 1) || bit_end > (size - 1))
1717		return -1;
1718
1719	if (size == 8) {
1720		status =
1721		    cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1722					  &tmp, 1);
1723	} else {
1724		status =
1725		    cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1726					  &tmp, 4);
1727	}
1728
1729	if (status < 0)
1730		return status;
1731
1732	mask = 1 << bit_end;
1733	for (i = bit_end; i > bit_start && i > 0; i--)
1734		mask = mask + (1 << (i - 1));
1735
1736	value <<= bit_start;
1737
1738	if (size == 8) {
1739		tmp &= ~mask;
1740		tmp |= value;
1741		tmp &= 0xff;
1742		status =
1743		    cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1744					   tmp, 1);
1745	} else {
1746		tmp &= ~mask;
1747		tmp |= value;
1748		status =
1749		    cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1750					   tmp, 4);
1751	}
1752
1753	return status;
1754}
1755
1756int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1757					u16 saddr, u32 mask, u32 value)
1758{
1759	u32 temp;
1760	int status = 0;
1761
1762	status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1763
1764	if (status < 0)
1765		return status;
1766
1767	temp &= ~mask;
1768	temp |= value;
1769
1770	status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1771
1772	return status;
1773}
1774
1775u32 cx231xx_set_field(u32 field_mask, u32 data)
1776{
1777	u32 temp;
1778
1779	for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
1780		data <<= 1;
1781
1782	return data;
1783}
1784