PageRenderTime 71ms CodeModel.GetById 43ms app.highlight 25ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/media/video/hdpvr/hdpvr-core.c

https://bitbucket.org/ndreys/linux-sunxi
C | 478 lines | 376 code | 69 blank | 33 comment | 39 complexity | 68f58a64e7d90a530ef0d67140dbacf4 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1/*
  2 * Hauppauge HD PVR USB driver
  3 *
  4 * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com)
  5 * Copyright (C) 2008      Janne Grunau (j@jannau.net)
  6 * Copyright (C) 2008      John Poet
  7 *
  8 *	This program is free software; you can redistribute it and/or
  9 *	modify it under the terms of the GNU General Public License as
 10 *	published by the Free Software Foundation, version 2.
 11 *
 12 */
 13
 14#include <linux/kernel.h>
 15#include <linux/errno.h>
 16#include <linux/init.h>
 17#include <linux/slab.h>
 18#include <linux/module.h>
 19#include <linux/uaccess.h>
 20#include <asm/atomic.h>
 21#include <linux/usb.h>
 22#include <linux/mutex.h>
 23#include <linux/i2c.h>
 24
 25#include <linux/videodev2.h>
 26#include <media/v4l2-dev.h>
 27#include <media/v4l2-common.h>
 28
 29#include "hdpvr.h"
 30
 31static int video_nr[HDPVR_MAX] = {[0 ... (HDPVR_MAX - 1)] = UNSET};
 32module_param_array(video_nr, int, NULL, 0);
 33MODULE_PARM_DESC(video_nr, "video device number (-1=Auto)");
 34
 35/* holds the number of currently registered devices */
 36static atomic_t dev_nr = ATOMIC_INIT(-1);
 37
 38int hdpvr_debug;
 39module_param(hdpvr_debug, int, S_IRUGO|S_IWUSR);
 40MODULE_PARM_DESC(hdpvr_debug, "enable debugging output");
 41
 42static uint default_video_input = HDPVR_VIDEO_INPUTS;
 43module_param(default_video_input, uint, S_IRUGO|S_IWUSR);
 44MODULE_PARM_DESC(default_video_input, "default video input: 0=Component / "
 45		 "1=S-Video / 2=Composite");
 46
 47static uint default_audio_input = HDPVR_AUDIO_INPUTS;
 48module_param(default_audio_input, uint, S_IRUGO|S_IWUSR);
 49MODULE_PARM_DESC(default_audio_input, "default audio input: 0=RCA back / "
 50		 "1=RCA front / 2=S/PDIF");
 51
 52static int boost_audio;
 53module_param(boost_audio, bool, S_IRUGO|S_IWUSR);
 54MODULE_PARM_DESC(boost_audio, "boost the audio signal");
 55
 56
 57/* table of devices that work with this driver */
 58static struct usb_device_id hdpvr_table[] = {
 59	{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID) },
 60	{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID1) },
 61	{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID2) },
 62	{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID3) },
 63	{ USB_DEVICE(HD_PVR_VENDOR_ID, HD_PVR_PRODUCT_ID4) },
 64	{ }					/* Terminating entry */
 65};
 66MODULE_DEVICE_TABLE(usb, hdpvr_table);
 67
 68
 69void hdpvr_delete(struct hdpvr_device *dev)
 70{
 71	hdpvr_free_buffers(dev);
 72
 73	if (dev->video_dev)
 74		video_device_release(dev->video_dev);
 75
 76	usb_put_dev(dev->udev);
 77}
 78
 79static void challenge(u8 *bytes)
 80{
 81	u64 *i64P, tmp64;
 82	uint i, idx;
 83
 84	for (idx = 0; idx < 32; ++idx) {
 85
 86		if (idx & 0x3)
 87			bytes[(idx >> 3) + 3] = bytes[(idx >> 2) & 0x3];
 88
 89		switch (idx & 0x3) {
 90		case 0x3:
 91			bytes[2] += bytes[3] * 4 + bytes[4] + bytes[5];
 92			bytes[4] += bytes[(idx & 0x1) * 2] * 9 + 9;
 93			break;
 94		case 0x1:
 95			bytes[0] *= 8;
 96			bytes[0] += 7*idx + 4;
 97			bytes[6] += bytes[3] * 3;
 98			break;
 99		case 0x0:
100			bytes[3 - (idx >> 3)] = bytes[idx >> 2];
101			bytes[5] += bytes[6] * 3;
102			for (i = 0; i < 3; i++)
103				bytes[3] *= bytes[3] + 1;
104			break;
105		case 0x2:
106			for (i = 0; i < 3; i++)
107				bytes[1] *= bytes[6] + 1;
108			for (i = 0; i < 3; i++) {
109				i64P = (u64 *)bytes;
110				tmp64 = le64_to_cpup(i64P);
111				tmp64 <<= bytes[7] & 0x0f;
112				*i64P += cpu_to_le64(tmp64);
113			}
114			break;
115		}
116	}
117}
118
119/* try to init the device like the windows driver */
120static int device_authorization(struct hdpvr_device *dev)
121{
122
123	int ret, retval = -ENOMEM;
124	char request_type = 0x38, rcv_request = 0x81;
125	char *response;
126#ifdef HDPVR_DEBUG
127	size_t buf_size = 46;
128	char *print_buf = kzalloc(5*buf_size+1, GFP_KERNEL);
129	if (!print_buf) {
130		v4l2_err(&dev->v4l2_dev, "Out of memory\n");
131		return retval;
132	}
133#endif
134
135	mutex_lock(&dev->usbc_mutex);
136	ret = usb_control_msg(dev->udev,
137			      usb_rcvctrlpipe(dev->udev, 0),
138			      rcv_request, 0x80 | request_type,
139			      0x0400, 0x0003,
140			      dev->usbc_buf, 46,
141			      10000);
142	if (ret != 46) {
143		v4l2_err(&dev->v4l2_dev,
144			 "unexpected answer of status request, len %d\n", ret);
145		goto unlock;
146	}
147#ifdef HDPVR_DEBUG
148	else {
149		hex_dump_to_buffer(dev->usbc_buf, 46, 16, 1, print_buf,
150				   5*buf_size+1, 0);
151		v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
152			 "Status request returned, len %d: %s\n",
153			 ret, print_buf);
154	}
155#endif
156
157	v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
158			  dev->usbc_buf[1], &dev->usbc_buf[2]);
159
160	switch (dev->usbc_buf[1]) {
161	case HDPVR_FIRMWARE_VERSION:
162		dev->flags &= ~HDPVR_FLAG_AC3_CAP;
163		break;
164	case HDPVR_FIRMWARE_VERSION_AC3:
165	case HDPVR_FIRMWARE_VERSION_0X12:
166	case HDPVR_FIRMWARE_VERSION_0X15:
167		dev->flags |= HDPVR_FLAG_AC3_CAP;
168		break;
169	default:
170		v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might"
171			  " not work.\n");
172		if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3)
173			dev->flags |= HDPVR_FLAG_AC3_CAP;
174		else
175			dev->flags &= ~HDPVR_FLAG_AC3_CAP;
176	}
177
178	response = dev->usbc_buf+38;
179#ifdef HDPVR_DEBUG
180	hex_dump_to_buffer(response, 8, 16, 1, print_buf, 5*buf_size+1, 0);
181	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, "challenge: %s\n",
182		 print_buf);
183#endif
184	challenge(response);
185#ifdef HDPVR_DEBUG
186	hex_dump_to_buffer(response, 8, 16, 1, print_buf, 5*buf_size+1, 0);
187	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, " response: %s\n",
188		 print_buf);
189#endif
190
191	msleep(100);
192	ret = usb_control_msg(dev->udev,
193			      usb_sndctrlpipe(dev->udev, 0),
194			      0xd1, 0x00 | request_type,
195			      0x0000, 0x0000,
196			      response, 8,
197			      10000);
198	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
199		 "magic request returned %d\n", ret);
200
201	retval = ret != 8;
202unlock:
203	mutex_unlock(&dev->usbc_mutex);
204	return retval;
205}
206
207static int hdpvr_device_init(struct hdpvr_device *dev)
208{
209	int ret;
210	u8 *buf;
211	struct hdpvr_video_info *vidinf;
212
213	if (device_authorization(dev))
214		return -EACCES;
215
216	/* default options for init */
217	hdpvr_set_options(dev);
218
219	/* set filter options */
220	mutex_lock(&dev->usbc_mutex);
221	buf = dev->usbc_buf;
222	buf[0] = 0x03; buf[1] = 0x03; buf[2] = 0x00; buf[3] = 0x00;
223	ret = usb_control_msg(dev->udev,
224			      usb_sndctrlpipe(dev->udev, 0),
225			      0x01, 0x38,
226			      CTRL_LOW_PASS_FILTER_VALUE, CTRL_DEFAULT_INDEX,
227			      buf, 4,
228			      1000);
229	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
230		 "control request returned %d\n", ret);
231	mutex_unlock(&dev->usbc_mutex);
232
233	vidinf = get_video_info(dev);
234	if (!vidinf)
235		v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
236			"no valid video signal or device init failed\n");
237	else
238		kfree(vidinf);
239
240	/* enable fan and bling leds */
241	mutex_lock(&dev->usbc_mutex);
242	buf[0] = 0x1;
243	ret = usb_control_msg(dev->udev,
244			      usb_sndctrlpipe(dev->udev, 0),
245			      0xd4, 0x38, 0, 0, buf, 1,
246			      1000);
247	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
248		 "control request returned %d\n", ret);
249
250	/* boost analog audio */
251	buf[0] = boost_audio;
252	ret = usb_control_msg(dev->udev,
253			      usb_sndctrlpipe(dev->udev, 0),
254			      0xd5, 0x38, 0, 0, buf, 1,
255			      1000);
256	v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev,
257		 "control request returned %d\n", ret);
258	mutex_unlock(&dev->usbc_mutex);
259
260	dev->status = STATUS_IDLE;
261	return 0;
262}
263
264static const struct hdpvr_options hdpvr_default_options = {
265	.video_std	= HDPVR_60HZ,
266	.video_input	= HDPVR_COMPONENT,
267	.audio_input	= HDPVR_RCA_BACK,
268	.bitrate	= 65, /* 6 mbps */
269	.peak_bitrate	= 90, /* 9 mbps */
270	.bitrate_mode	= HDPVR_CONSTANT,
271	.gop_mode	= HDPVR_SIMPLE_IDR_GOP,
272	.audio_codec	= V4L2_MPEG_AUDIO_ENCODING_AAC,
273	.brightness	= 0x86,
274	.contrast	= 0x80,
275	.hue		= 0x80,
276	.saturation	= 0x80,
277	.sharpness	= 0x80,
278};
279
280static int hdpvr_probe(struct usb_interface *interface,
281		       const struct usb_device_id *id)
282{
283	struct hdpvr_device *dev;
284	struct usb_host_interface *iface_desc;
285	struct usb_endpoint_descriptor *endpoint;
286	struct i2c_client *client;
287	size_t buffer_size;
288	int i;
289	int retval = -ENOMEM;
290
291	/* allocate memory for our device state and initialize it */
292	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
293	if (!dev) {
294		err("Out of memory");
295		goto error;
296	}
297
298	dev->workqueue = 0;
299
300	/* register v4l2_device early so it can be used for printks */
301	if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) {
302		err("v4l2_device_register failed");
303		goto error;
304	}
305
306	mutex_init(&dev->io_mutex);
307	mutex_init(&dev->i2c_mutex);
308	mutex_init(&dev->usbc_mutex);
309	dev->usbc_buf = kmalloc(64, GFP_KERNEL);
310	if (!dev->usbc_buf) {
311		v4l2_err(&dev->v4l2_dev, "Out of memory\n");
312		goto error;
313	}
314
315	init_waitqueue_head(&dev->wait_buffer);
316	init_waitqueue_head(&dev->wait_data);
317
318	dev->workqueue = create_singlethread_workqueue("hdpvr_buffer");
319	if (!dev->workqueue)
320		goto error;
321
322	/* init video transfer queues */
323	INIT_LIST_HEAD(&dev->free_buff_list);
324	INIT_LIST_HEAD(&dev->rec_buff_list);
325
326	dev->options = hdpvr_default_options;
327
328	if (default_video_input < HDPVR_VIDEO_INPUTS)
329		dev->options.video_input = default_video_input;
330
331	if (default_audio_input < HDPVR_AUDIO_INPUTS) {
332		dev->options.audio_input = default_audio_input;
333		if (default_audio_input == HDPVR_SPDIF)
334			dev->options.audio_codec =
335				V4L2_MPEG_AUDIO_ENCODING_AC3;
336	}
337
338	dev->udev = usb_get_dev(interface_to_usbdev(interface));
339
340	/* set up the endpoint information */
341	/* use only the first bulk-in and bulk-out endpoints */
342	iface_desc = interface->cur_altsetting;
343	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
344		endpoint = &iface_desc->endpoint[i].desc;
345
346		if (!dev->bulk_in_endpointAddr &&
347		    usb_endpoint_is_bulk_in(endpoint)) {
348			/* USB interface description is buggy, reported max
349			 * packet size is 512 bytes, windows driver uses 8192 */
350			buffer_size = 8192;
351			dev->bulk_in_size = buffer_size;
352			dev->bulk_in_endpointAddr = endpoint->bEndpointAddress;
353		}
354
355	}
356	if (!dev->bulk_in_endpointAddr) {
357		v4l2_err(&dev->v4l2_dev, "Could not find bulk-in endpoint\n");
358		goto error;
359	}
360
361	/* init the device */
362	if (hdpvr_device_init(dev)) {
363		v4l2_err(&dev->v4l2_dev, "device init failed\n");
364		goto error;
365	}
366
367	mutex_lock(&dev->io_mutex);
368	if (hdpvr_alloc_buffers(dev, NUM_BUFFERS)) {
369		mutex_unlock(&dev->io_mutex);
370		v4l2_err(&dev->v4l2_dev,
371			 "allocating transfer buffers failed\n");
372		goto error;
373	}
374	mutex_unlock(&dev->io_mutex);
375
376	if (hdpvr_register_videodev(dev, &interface->dev,
377				    video_nr[atomic_inc_return(&dev_nr)])) {
378		v4l2_err(&dev->v4l2_dev, "registering videodev failed\n");
379		goto error;
380	}
381
382#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
383	retval = hdpvr_register_i2c_adapter(dev);
384	if (retval < 0) {
385		v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n");
386		goto error;
387	}
388
389	client = hdpvr_register_ir_rx_i2c(dev);
390	if (!client) {
391		v4l2_err(&dev->v4l2_dev, "i2c IR RX device register failed\n");
392		goto reg_fail;
393	}
394
395	client = hdpvr_register_ir_tx_i2c(dev);
396	if (!client) {
397		v4l2_err(&dev->v4l2_dev, "i2c IR TX device register failed\n");
398		goto reg_fail;
399	}
400#endif
401
402	/* let the user know what node this device is now attached to */
403	v4l2_info(&dev->v4l2_dev, "device now attached to %s\n",
404		  video_device_node_name(dev->video_dev));
405	return 0;
406
407reg_fail:
408#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
409	i2c_del_adapter(&dev->i2c_adapter);
410#endif
411error:
412	if (dev) {
413		/* Destroy single thread */
414		if (dev->workqueue)
415			destroy_workqueue(dev->workqueue);
416		/* this frees allocated memory */
417		hdpvr_delete(dev);
418	}
419	return retval;
420}
421
422static void hdpvr_disconnect(struct usb_interface *interface)
423{
424	struct hdpvr_device *dev = to_hdpvr_dev(usb_get_intfdata(interface));
425
426	v4l2_info(&dev->v4l2_dev, "device %s disconnected\n",
427		  video_device_node_name(dev->video_dev));
428	/* prevent more I/O from starting and stop any ongoing */
429	mutex_lock(&dev->io_mutex);
430	dev->status = STATUS_DISCONNECTED;
431	wake_up_interruptible(&dev->wait_data);
432	wake_up_interruptible(&dev->wait_buffer);
433	mutex_unlock(&dev->io_mutex);
434	v4l2_device_disconnect(&dev->v4l2_dev);
435	msleep(100);
436	flush_workqueue(dev->workqueue);
437	mutex_lock(&dev->io_mutex);
438	hdpvr_cancel_queue(dev);
439	mutex_unlock(&dev->io_mutex);
440#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
441	i2c_del_adapter(&dev->i2c_adapter);
442#endif
443	video_unregister_device(dev->video_dev);
444	atomic_dec(&dev_nr);
445}
446
447
448static struct usb_driver hdpvr_usb_driver = {
449	.name =		"hdpvr",
450	.probe =	hdpvr_probe,
451	.disconnect =	hdpvr_disconnect,
452	.id_table =	hdpvr_table,
453};
454
455static int __init hdpvr_init(void)
456{
457	int result;
458
459	/* register this driver with the USB subsystem */
460	result = usb_register(&hdpvr_usb_driver);
461	if (result)
462		err("usb_register failed. Error number %d", result);
463
464	return result;
465}
466
467static void __exit hdpvr_exit(void)
468{
469	/* deregister this driver with the USB subsystem */
470	usb_deregister(&hdpvr_usb_driver);
471}
472
473module_init(hdpvr_init);
474module_exit(hdpvr_exit);
475
476MODULE_LICENSE("GPL");
477MODULE_AUTHOR("Janne Grunau");
478MODULE_DESCRIPTION("Hauppauge HD PVR driver");