include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / media / video / au0828 / au0828-dvb.c
index 453fb3e..f1edf1d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  Driver for the Auvitek USB bridge
  *
- *  Copyright (c) 2008 Steven Toth <stoth@hauppauge.com>
+ *  Copyright (c) 2008 Steven Toth <stoth@linuxtv.org>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@
  */
 
 #include <linux/module.h>
+#include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/suspend.h>
 #include "au0828.h"
 #include "au8522.h"
 #include "xc5000.h"
+#include "mxl5007t.h"
+#include "tda18271.h"
 
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
+#define _AU0828_BULKPIPE 0x83
+#define _BULKPIPESIZE 0xe522
+
+static u8 hauppauge_hvr950q_led_states[] = {
+       0x00, /* off */
+       0x02, /* yellow */
+       0x04, /* green */
+};
+
+static struct au8522_led_config hauppauge_hvr950q_led_cfg = {
+       .gpio_output = 0x00e0,
+       .gpio_output_enable  = 0x6006,
+       .gpio_output_disable = 0x0660,
+
+       .gpio_leds = 0x00e2,
+       .led_states  = hauppauge_hvr950q_led_states,
+       .num_led_states = sizeof(hauppauge_hvr950q_led_states),
+
+       .vsb8_strong   = 20 /* dB */ * 10,
+       .qam64_strong  = 25 /* dB */ * 10,
+       .qam256_strong = 32 /* dB */ * 10,
+};
+
 static struct au8522_config hauppauge_hvr950q_config = {
        .demod_address = 0x8e >> 1,
        .status_mode   = AU8522_DEMODLOCKING,
+       .qam_if        = AU8522_IF_6MHZ,
+       .vsb_if        = AU8522_IF_6MHZ,
+       .led_cfg       = &hauppauge_hvr950q_led_cfg,
+};
+
+static struct au8522_config fusionhdtv7usb_config = {
+       .demod_address = 0x8e >> 1,
+       .status_mode   = AU8522_DEMODLOCKING,
+       .qam_if        = AU8522_IF_6MHZ,
+       .vsb_if        = AU8522_IF_6MHZ,
+};
+
+static struct au8522_config hauppauge_woodbury_config = {
+       .demod_address = 0x8e >> 1,
+       .status_mode   = AU8522_DEMODLOCKING,
+       .qam_if        = AU8522_IF_4MHZ,
+       .vsb_if        = AU8522_IF_3_25MHZ,
 };
 
 static struct xc5000_config hauppauge_hvr950q_tunerconfig = {
        .i2c_address      = 0x61,
        .if_khz           = 6000,
-       .tuner_callback   = au0828_tuner_callback
+};
+
+static struct mxl5007t_config mxl5007t_hvr950q_config = {
+       .xtal_freq_hz = MxL_XTAL_24_MHZ,
+       .if_freq_hz = MxL_IF_6_MHZ,
+};
+
+static struct tda18271_config hauppauge_woodbury_tunerconfig = {
+       .gate    = TDA18271_GATE_DIGITAL,
 };
 
 /*-------------------------------------------------------------------*/
@@ -49,7 +100,7 @@ static void urb_completion(struct urb *purb)
        struct au0828_dev *dev = purb->context;
        int ptype = usb_pipetype(purb->pipe);
 
-       dprintk(2, "%s()\n", __FUNCTION__);
+       dprintk(2, "%s()\n", __func__);
 
        if (!dev)
                return;
@@ -58,14 +109,16 @@ static void urb_completion(struct urb *purb)
                return;
 
        if (ptype != PIPE_BULK) {
-               printk(KERN_ERR "%s() Unsupported URB type %d\n", __FUNCTION__, ptype);
+               printk(KERN_ERR "%s() Unsupported URB type %d\n",
+                      __func__, ptype);
                return;
        }
 
        ptr = (u8 *)purb->transfer_buffer;
 
        /* Feed the transport payload into the kernel demux */
-       dvb_dmx_swfilter_packets(&dev->dvb.demux, purb->transfer_buffer, purb->actual_length / 188);
+       dvb_dmx_swfilter_packets(&dev->dvb.demux,
+               purb->transfer_buffer, purb->actual_length / 188);
 
        /* Clean the buffer before we requeue */
        memset(purb->transfer_buffer, 0, URB_BUFSIZE);
@@ -78,9 +131,8 @@ static int stop_urb_transfer(struct au0828_dev *dev)
 {
        int i;
 
-       dprintk(2, "%s()\n", __FUNCTION__);
+       dprintk(2, "%s()\n", __func__);
 
-       /* FIXME:  Do we need to free the transfer_buffers? */
        for (i = 0; i < URB_COUNT; i++) {
                usb_kill_urb(dev->urbs[i]);
                kfree(dev->urbs[i]->transfer_buffer);
@@ -92,41 +144,38 @@ static int stop_urb_transfer(struct au0828_dev *dev)
        return 0;
 }
 
-#define _AU0828_BULKPIPE 0x83
-#define _BULKPIPESIZE 0xe522
-
 static int start_urb_transfer(struct au0828_dev *dev)
 {
        struct urb *purb;
        int i, ret = -ENOMEM;
 
-       dprintk(2, "%s()\n", __FUNCTION__);
+       dprintk(2, "%s()\n", __func__);
 
        if (dev->urb_streaming) {
-               dprintk(2, "%s: iso xfer already running!\n", __FUNCTION__);
+               dprintk(2, "%s: bulk xfer already running!\n", __func__);
                return 0;
        }
 
        for (i = 0; i < URB_COUNT; i++) {
 
                dev->urbs[i] = usb_alloc_urb(0, GFP_KERNEL);
-               if (!dev->urbs[i]) {
+               if (!dev->urbs[i])
                        goto err;
-               }
 
                purb = dev->urbs[i];
 
                purb->transfer_buffer = kzalloc(URB_BUFSIZE, GFP_KERNEL);
                if (!purb->transfer_buffer) {
                        usb_free_urb(purb);
-                       dev->urbs[i] = 0;
+                       dev->urbs[i] = NULL;
                        goto err;
                }
 
                purb->status = -EINPROGRESS;
                usb_fill_bulk_urb(purb,
                                  dev->usbdev,
-                                 usb_rcvbulkpipe(dev->usbdev, _AU0828_BULKPIPE),
+                                 usb_rcvbulkpipe(dev->usbdev,
+                                       _AU0828_BULKPIPE),
                                  purb->transfer_buffer,
                                  URB_BUFSIZE,
                                  urb_completion,
@@ -138,7 +187,8 @@ static int start_urb_transfer(struct au0828_dev *dev)
                ret = usb_submit_urb(dev->urbs[i], GFP_ATOMIC);
                if (ret != 0) {
                        stop_urb_transfer(dev);
-                       printk("%s: failed urb submission, err = %d\n", __FUNCTION__, ret);
+                       printk(KERN_ERR "%s: failed urb submission, "
+                              "err = %d\n", __func__, ret);
                        return ret;
                }
        }
@@ -157,7 +207,7 @@ static int au0828_dvb_start_feed(struct dvb_demux_feed *feed)
        struct au0828_dvb *dvb = &dev->dvb;
        int ret = 0;
 
-       dprintk(1, "%s()\n", __FUNCTION__);
+       dprintk(1, "%s()\n", __func__);
 
        if (!demux->dmx.frontend)
                return -EINVAL;
@@ -185,7 +235,7 @@ static int au0828_dvb_stop_feed(struct dvb_demux_feed *feed)
        struct au0828_dvb *dvb = &dev->dvb;
        int ret = 0;
 
-       dprintk(1, "%s()\n", __FUNCTION__);
+       dprintk(1, "%s()\n", __func__);
 
        if (dvb) {
                mutex_lock(&dvb->lock);
@@ -203,19 +253,19 @@ static int au0828_dvb_stop_feed(struct dvb_demux_feed *feed)
        return ret;
 }
 
-int dvb_register(struct au0828_dev *dev)
+static int dvb_register(struct au0828_dev *dev)
 {
        struct au0828_dvb *dvb = &dev->dvb;
        int result;
 
-       dprintk(1, "%s()\n", __FUNCTION__);
+       dprintk(1, "%s()\n", __func__);
 
        /* register adapter */
        result = dvb_register_adapter(&dvb->adapter, DRIVER_NAME, THIS_MODULE,
                                      &dev->usbdev->dev, adapter_nr);
        if (result < 0) {
-               printk(KERN_ERROR "%s: dvb_register_adapter failed (errno = %d)\n",
-                      DRIVER_NAME, result);
+               printk(KERN_ERR "%s: dvb_register_adapter failed "
+                      "(errno = %d)\n", DRIVER_NAME, result);
                goto fail_adapter;
        }
        dvb->adapter.priv = dev;
@@ -223,8 +273,8 @@ int dvb_register(struct au0828_dev *dev)
        /* register frontend */
        result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
        if (result < 0) {
-               printk(KERN_ERR "%s: dvb_register_frontend failed (errno = %d)\n",
-                      DRIVER_NAME, result);
+               printk(KERN_ERR "%s: dvb_register_frontend failed "
+                      "(errno = %d)\n", DRIVER_NAME, result);
                goto fail_frontend;
        }
 
@@ -257,16 +307,16 @@ int dvb_register(struct au0828_dev *dev)
        dvb->fe_hw.source = DMX_FRONTEND_0;
        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
        if (result < 0) {
-               printk(KERN_ERR "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
-                      DRIVER_NAME, result);
+               printk(KERN_ERR "%s: add_frontend failed "
+                      "(DMX_FRONTEND_0, errno = %d)\n", DRIVER_NAME, result);
                goto fail_fe_hw;
        }
 
        dvb->fe_mem.source = DMX_MEMORY_FE;
        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
        if (result < 0) {
-               printk(KERN_ERR "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
-                      DRIVER_NAME, result);
+               printk(KERN_ERR "%s: add_frontend failed "
+                      "(DMX_MEMORY_FE, errno = %d)\n", DRIVER_NAME, result);
                goto fail_fe_mem;
        }
 
@@ -302,9 +352,9 @@ void au0828_dvb_unregister(struct au0828_dev *dev)
 {
        struct au0828_dvb *dvb = &dev->dvb;
 
-       dprintk(1, "%s()\n", __FUNCTION__);
+       dprintk(1, "%s()\n", __func__);
 
-       if(dvb->frontend == NULL)
+       if (dvb->frontend == NULL)
                return;
 
        dvb_net_release(&dvb->net);
@@ -326,37 +376,59 @@ int au0828_dvb_register(struct au0828_dev *dev)
        struct au0828_dvb *dvb = &dev->dvb;
        int ret;
 
-       dprintk(1, "%s()\n", __FUNCTION__);
+       dprintk(1, "%s()\n", __func__);
 
        /* init frontend */
-       switch (dev->board) {
+       switch (dev->boardnr) {
        case AU0828_BOARD_HAUPPAUGE_HVR850:
        case AU0828_BOARD_HAUPPAUGE_HVR950Q:
-       case AU0828_BOARD_DVICO_FUSIONHDTV7:
                dvb->frontend = dvb_attach(au8522_attach,
                                &hauppauge_hvr950q_config,
                                &dev->i2c_adap);
+               if (dvb->frontend != NULL)
+                       dvb_attach(xc5000_attach, dvb->frontend, &dev->i2c_adap,
+                                  &hauppauge_hvr950q_tunerconfig);
+               break;
+       case AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL:
+               dvb->frontend = dvb_attach(au8522_attach,
+                               &hauppauge_hvr950q_config,
+                               &dev->i2c_adap);
+               if (dvb->frontend != NULL)
+                       dvb_attach(mxl5007t_attach, dvb->frontend,
+                                  &dev->i2c_adap, 0x60,
+                                  &mxl5007t_hvr950q_config);
+               break;
+       case AU0828_BOARD_HAUPPAUGE_WOODBURY:
+               dvb->frontend = dvb_attach(au8522_attach,
+                               &hauppauge_woodbury_config,
+                               &dev->i2c_adap);
+               if (dvb->frontend != NULL)
+                       dvb_attach(tda18271_attach, dvb->frontend,
+                                  0x60, &dev->i2c_adap,
+                                  &hauppauge_woodbury_tunerconfig);
+               break;
+       case AU0828_BOARD_DVICO_FUSIONHDTV7:
+               dvb->frontend = dvb_attach(au8522_attach,
+                               &fusionhdtv7usb_config,
+                               &dev->i2c_adap);
                if (dvb->frontend != NULL) {
-                       hauppauge_hvr950q_tunerconfig.priv = dev;
                        dvb_attach(xc5000_attach, dvb->frontend,
                                &dev->i2c_adap,
                                &hauppauge_hvr950q_tunerconfig);
                }
                break;
        default:
-               printk("The frontend of your DVB/ATSC card isn't supported yet\n");
+               printk(KERN_WARNING "The frontend of your DVB/ATSC card "
+                      "isn't supported yet\n");
                break;
        }
        if (NULL == dvb->frontend) {
-               printk(KERN_ERR "%s() Frontend initialization failed\n", __FUNCTION__);
+               printk(KERN_ERR "%s() Frontend initialization failed\n",
+                      __func__);
                return -1;
        }
-
-       /* Put the analog decoder in standby to keep it quiet */
-       au0828_call_i2c_clients(dev, TUNER_SET_STANDBY, NULL);
-
-       if (dvb->frontend->ops.analog_ops.standby)
-               dvb->frontend->ops.analog_ops.standby(dvb->frontend);
+       /* define general-purpose callback pointer */
+       dvb->frontend->callback = au0828_tuner_callback;
 
        /* register everything */
        ret = dvb_register(dev);