diff options
Diffstat (limited to 'drivers/media/dvb/dvb-usb/opera1.c')
-rw-r--r-- | drivers/media/dvb/dvb-usb/opera1.c | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c index 67c2aa59f74..518d7ad217d 100644 --- a/drivers/media/dvb/dvb-usb/opera1.c +++ b/drivers/media/dvb/dvb-usb/opera1.c @@ -25,6 +25,11 @@ #define REG_20_SYMBOLRATE_BYTE1 0x20 #define REG_21_SYMBOLRATE_BYTE2 0x21 +#define ADDR_B600_VOLTAGE_13V (0x02) +#define ADDR_B601_VOLTAGE_18V (0x03) +#define ADDR_B1A6_STREAM_CTRL (0x04) +#define ADDR_B880_READ_REMOTE (0x05) + struct opera1_state { u32 last_key_pressed; }; @@ -70,7 +75,7 @@ static int opera1_xilinx_rw(struct usb_device *dev, u8 request, u16 value, /* I2C */ static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, - u8 * buf, u16 len, int flag) + u8 * buf, u16 len) { int ret = 0; u8 request; @@ -83,16 +88,30 @@ static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, if (mutex_lock_interruptible(&dev->usb_mutex) < 0) return -EAGAIN; - request = (addr & 0xff00) >> 8; - if (!request) - request = 0xb1; - value = (addr & 0xff); - if (flag & OPERA_READ_MSG) { - value |= 0x01; + switch (addr>>1){ + case ADDR_B600_VOLTAGE_13V: + request=0xb6; + value=0x00; + break; + case ADDR_B601_VOLTAGE_18V: + request=0xb6; + value=0x01; + break; + case ADDR_B1A6_STREAM_CTRL: + request=0xb1; + value=0xa6; + break; + case ADDR_B880_READ_REMOTE: + request=0xb8; + value=0x80; + break; + default: + request=0xb1; + value=addr; } - if (request == 0xa0) - value = 0xe600; - ret = opera1_xilinx_rw(dev->udev, request, value, buf, len, flag); + ret = opera1_xilinx_rw(dev->udev, request, + value, buf, len, + addr&0x01?OPERA_READ_MSG:OPERA_WRITE_MSG); mutex_unlock(&dev->usb_mutex); return ret; @@ -111,13 +130,10 @@ static int opera1_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], for (i = 0; i < num; i++) { if ((tmp = opera1_usb_i2c_msgxfer(d, - msg[i].addr, + (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0), msg[i].buf, - msg[i].len, - (msg[i].flags == - I2C_M_RD ? - OPERA_READ_MSG : - OPERA_WRITE_MSG))!= msg[i].len)) { + msg[i].len + )!= msg[i].len)) { break; } if (dvb_usb_opera1_debug & 0x10) @@ -142,12 +158,12 @@ static int opera1_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) static u8 command_13v[1]={0x00}; static u8 command_18v[1]={0x01}; struct i2c_msg msg[] = { - {.addr = 0xb600,.flags = 0,.buf = command_13v,.len = 1}, + {.addr = ADDR_B600_VOLTAGE_13V,.flags = 0,.buf = command_13v,.len = 1}, }; struct dvb_usb_adapter *udev_adap = (struct dvb_usb_adapter *)(fe->dvb->priv); if (voltage == SEC_VOLTAGE_18) { - msg[0].addr = 0xb601; + msg[0].addr = ADDR_B601_VOLTAGE_18V; msg[0].buf = command_18v; } i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1); @@ -220,7 +236,7 @@ static u8 opera1_inittab[] = { }; static struct stv0299_config opera1_stv0299_config = { - .demod_address = 0xd0, + .demod_address = 0xd0>>1, .min_delay_ms = 100, .mclk = 88000000UL, .invert = 1, @@ -245,19 +261,21 @@ static int opera1_frontend_attach(struct dvb_usb_adapter *d) static int opera1_tuner_attach(struct dvb_usb_adapter *adap) { - adap->pll_addr = 0xc0; - adap->pll_desc = &dvb_pll_opera1; - adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; + dvb_attach( + dvb_pll_attach, adap->fe, 0xc0>>1, + &adap->dev->i2c_adap, &dvb_pll_opera1 + ); return 0; } static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff) { - int addr = onoff ? 0xb701 : 0xb700; u8 val = onoff ? 0x01 : 0x00; + if (dvb_usb_opera1_debug) info("power %s", onoff ? "on" : "off"); - return opera1_usb_i2c_msgxfer(d, addr, &val, 1, OPERA_WRITE_MSG); + return opera1_xilinx_rw(d->udev, 0xb7, val, + &val, 1, OPERA_WRITE_MSG); } static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) @@ -265,7 +283,7 @@ static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) static u8 buf_start[2] = { 0xff, 0x03 }; static u8 buf_stop[2] = { 0xff, 0x00 }; struct i2c_msg start_tuner[] = { - {.addr = 0xb1a6,.buf = onoff ? buf_start : buf_stop,.len = 2}, + {.addr = ADDR_B1A6_STREAM_CTRL,.buf = onoff ? buf_start : buf_stop,.len = 2}, }; if (dvb_usb_opera1_debug) info("streaming %s", onoff ? "on" : "off"); @@ -278,7 +296,7 @@ static int opera1_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, { u8 b_pid[3]; struct i2c_msg msg[] = { - {.addr = 0xb1a6,.buf = b_pid,.len = 3}, + {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3}, }; if (dvb_usb_opera1_debug) info("pidfilter index: %d pid: %d %s", index, pid, @@ -295,7 +313,7 @@ static int opera1_pid_filter_control(struct dvb_usb_adapter *adap, int onoff) int u = 0x04; u8 b_pid[3]; struct i2c_msg msg[] = { - {.addr = 0xb1a6,.buf = b_pid,.len = 3}, + {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3}, }; if (dvb_usb_opera1_debug) info("%s hw-pidfilter", onoff ? "enable" : "disable"); @@ -345,7 +363,7 @@ static int opera1_rc_query(struct dvb_usb_device *dev, u32 * event, int *state) const u16 startmarker1 = 0x10ed; const u16 startmarker2 = 0x11ec; struct i2c_msg read_remote[] = { - {.addr = 0xb880,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32}, + {.addr = ADDR_B880_READ_REMOTE,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32}, }; int i = 0; u32 send_key = 0; @@ -467,7 +485,7 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev, static struct dvb_usb_device_properties opera1_properties = { .caps = DVB_USB_IS_AN_I2C_ADAPTER, .usb_ctrl = CYPRESS_FX2, - .firmware = "opera.fw", + .firmware = "dvb-usb-opera-01.fw", .size_of_priv = sizeof(struct opera1_state), .power_ctrl = opera1_power_ctrl, @@ -522,7 +540,7 @@ static int opera1_probe(struct usb_interface *intf, if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && udev->descriptor.idVendor == USB_VID_OPERA1 && (d == NULL - || opera1_xilinx_load_firmware(udev, "opera1-fpga.fw") != 0) + || opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga.fw") != 0) ) { return -EINVAL; } |