]> err.no Git - linux-2.6/blobdiff - drivers/media/dvb/dvb-usb/au6610.c
Merge branch 'for-linus' of git://linux-nfs.org/~bfields/linux
[linux-2.6] / drivers / media / dvb / dvb-usb / au6610.c
index 1796a7d63aa133f061e0d45d91aafd51ba6e9c26..2ccb90fa60c85917cd9604443cb13e5169e61f5f 100644 (file)
@@ -1,6 +1,6 @@
 /* DVB USB compliant linux driver for Sigmatek DVB-110 DVB-T USB2.0 receiver
  *
- * Copyright (C) 2006 Antti Palosaari (crope@iki.fi)
+ * Copyright (C) 2006 Antti Palosaari <crope@iki.fi>
  *
  *     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 the Free
@@ -19,14 +19,15 @@ static int dvb_usb_au6610_debug;
 module_param_named(debug, dvb_usb_au6610_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
 
+DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
 static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
                          u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
 {
        int ret;
        u16 index;
-       u8 usb_buf[6]; /* enough for all known requests, read returns 5 and write 6 bytes */
-
+       u8 usb_buf[6]; /* enough for all known requests,
+                         read returns 5 and write 6 bytes */
        switch (wlen) {
        case 1:
                index = wbuf[0] << 8;
@@ -41,7 +42,7 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
        }
 
        ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), operation,
-                             USB_TYPE_VENDOR | USB_DIR_IN, addr, index, usb_buf,
+                             USB_TYPE_VENDOR|USB_DIR_IN, addr << 1, index, usb_buf,
                              sizeof(usb_buf), AU6610_USB_TIMEOUT);
 
        if (ret < 0)
@@ -57,7 +58,8 @@ static int au6610_usb_msg(struct dvb_usb_device *d, u8 operation, u8 addr,
        return ret;
 }
 
-static int au6610_i2c_msg(struct dvb_usb_device *d, u8 addr, u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
+static int au6610_i2c_msg(struct dvb_usb_device *d, u8 addr,
+                         u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
 {
        u8 request;
        u8 wo = (rbuf == NULL || rlen == 0); /* write-only */
@@ -73,22 +75,24 @@ static int au6610_i2c_msg(struct dvb_usb_device *d, u8 addr, u8 *wbuf, u16 wlen,
 
 
 /* I2C */
-static int au6610_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num)
+static int au6610_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
+                          int num)
 {
        struct dvb_usb_device *d = i2c_get_adapdata(adap);
        int i;
 
-       if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
-               return -EAGAIN;
-
        if (num > 2)
                return -EINVAL;
 
+       if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
+               return -EAGAIN;
+
        for (i = 0; i < num; i++) {
                /* write/read request */
                if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
                        if (au6610_i2c_msg(d, msg[i].addr, msg[i].buf,
-                                          msg[i].len, msg[i+1].buf, msg[i+1].len) < 0)
+                                          msg[i].len, msg[i+1].buf,
+                                          msg[i+1].len) < 0)
                                break;
                        i++;
                } else if (au6610_i2c_msg(d, msg[i].addr, msg[i].buf,
@@ -122,12 +126,11 @@ static int au6610_identify_state(struct usb_device *udev,
 }
 
 static struct zl10353_config au6610_zl10353_config = {
-       .demod_address = 0x1e,
+       .demod_address = 0x0f,
        .no_tuner = 1,
        .parallel_ts = 1,
 };
 
-
 static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
 {
        if ((adap->fe = dvb_attach(zl10353_attach, &au6610_zl10353_config,
@@ -138,10 +141,22 @@ static int au6610_zl10353_frontend_attach(struct dvb_usb_adapter *adap)
        return -EIO;
 }
 
+static struct qt1010_config au6610_qt1010_config = {
+       .i2c_address = 0x62
+};
+
+static int au6610_qt1010_tuner_attach(struct dvb_usb_adapter *adap)
+{
+       return dvb_attach(qt1010_attach,
+                         adap->fe, &adap->dev->i2c_adap,
+                         &au6610_qt1010_config) == NULL ? -ENODEV : 0;
+}
+
 /* DVB USB Driver stuff */
 static struct dvb_usb_device_properties au6610_properties;
 
-static int au6610_probe(struct usb_interface *intf, const struct usb_device_id *id)
+static int au6610_probe(struct usb_interface *intf,
+                       const struct usb_device_id *id)
 {
        struct dvb_usb_device *d;
        struct usb_host_interface *alt;
@@ -150,7 +165,9 @@ static int au6610_probe(struct usb_interface *intf, const struct usb_device_id *
        if (intf->num_altsetting < AU6610_ALTSETTING_COUNT)
                return -ENODEV;
 
-       if ((ret = dvb_usb_device_init(intf, &au6610_properties, THIS_MODULE, &d)) == 0) {
+       ret = dvb_usb_device_init(intf, &au6610_properties, THIS_MODULE, &d,
+                                 adapter_nr);
+       if (ret == 0) {
                alt = usb_altnum_to_altsetting(intf, AU6610_ALTSETTING);
 
                if (alt == NULL) {
@@ -180,7 +197,7 @@ static struct dvb_usb_device_properties au6610_properties = {
        .adapter = {
                {
                        .frontend_attach  = au6610_zl10353_frontend_attach,
-                       .tuner_attach     = qt1010_tuner_attach,
+                       .tuner_attach     = au6610_qt1010_tuner_attach,
 
                        .stream = {
                                .type = USB_ISOC,