aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Gittler <g.marco@freenet.de>2007-04-23 16:52:58 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-04-27 14:45:59 -0400
commit86534e5e8eaeab2f5d2e92cff5e16980750095c6 (patch)
tree67a2398455fbff1f19f3de7d0750c9042a418bdd
parent12df2f54e5522d89b3de6df62a800a0edeb10dcc (diff)
V4L/DVB (5558): Opera: use 7-bit i2c addresses
- the tuner i2c addr now without define (as wanted). - now 7 bit addr are used (the power_ctrl fkt ist ok so, because this is a raw write) - the addr >> 1 , addr << 1 is ok so, i think beause the read write is now taken from the last bit. - now i have no datasheet for the device, all taken from usb-logs Signed-off-by: Marco Gittler <g.marco@freenet.de> Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/dvb/dvb-usb/dvb-usb-ids.h2
-rw-r--r--drivers/media/dvb/dvb-usb/opera1.c78
2 files changed, 49 insertions, 31 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index e4e60619421e..97715f7514d6 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -32,13 +32,13 @@
32#define USB_VID_LITEON 0x04ca 32#define USB_VID_LITEON 0x04ca
33#define USB_VID_MEDION 0x1660 33#define USB_VID_MEDION 0x1660
34#define USB_VID_MSI 0x0db0 34#define USB_VID_MSI 0x0db0
35#define USB_VID_OPERA1 0x695c
35#define USB_VID_PINNACLE 0x2304 36#define USB_VID_PINNACLE 0x2304
36#define USB_VID_VISIONPLUS 0x13d3 37#define USB_VID_VISIONPLUS 0x13d3
37#define USB_VID_TWINHAN 0x1822 38#define USB_VID_TWINHAN 0x1822
38#define USB_VID_ULTIMA_ELECTRONIC 0x05d8 39#define USB_VID_ULTIMA_ELECTRONIC 0x05d8
39#define USB_VID_UNIWILL 0x1584 40#define USB_VID_UNIWILL 0x1584
40#define USB_VID_WIDEVIEW 0x14aa 41#define USB_VID_WIDEVIEW 0x14aa
41#define USB_VID_OPERA1 0x695c
42 42
43/* Product IDs */ 43/* Product IDs */
44#define USB_PID_ADSTECH_USB2_COLD 0xa333 44#define USB_PID_ADSTECH_USB2_COLD 0xa333
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c
index 67c2aa59f74c..518d7ad217df 100644
--- a/drivers/media/dvb/dvb-usb/opera1.c
+++ b/drivers/media/dvb/dvb-usb/opera1.c
@@ -25,6 +25,11 @@
25#define REG_20_SYMBOLRATE_BYTE1 0x20 25#define REG_20_SYMBOLRATE_BYTE1 0x20
26#define REG_21_SYMBOLRATE_BYTE2 0x21 26#define REG_21_SYMBOLRATE_BYTE2 0x21
27 27
28#define ADDR_B600_VOLTAGE_13V (0x02)
29#define ADDR_B601_VOLTAGE_18V (0x03)
30#define ADDR_B1A6_STREAM_CTRL (0x04)
31#define ADDR_B880_READ_REMOTE (0x05)
32
28struct opera1_state { 33struct opera1_state {
29 u32 last_key_pressed; 34 u32 last_key_pressed;
30}; 35};
@@ -70,7 +75,7 @@ static int opera1_xilinx_rw(struct usb_device *dev, u8 request, u16 value,
70/* I2C */ 75/* I2C */
71 76
72static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, 77static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr,
73 u8 * buf, u16 len, int flag) 78 u8 * buf, u16 len)
74{ 79{
75 int ret = 0; 80 int ret = 0;
76 u8 request; 81 u8 request;
@@ -83,16 +88,30 @@ static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr,
83 if (mutex_lock_interruptible(&dev->usb_mutex) < 0) 88 if (mutex_lock_interruptible(&dev->usb_mutex) < 0)
84 return -EAGAIN; 89 return -EAGAIN;
85 90
86 request = (addr & 0xff00) >> 8; 91 switch (addr>>1){
87 if (!request) 92 case ADDR_B600_VOLTAGE_13V:
88 request = 0xb1; 93 request=0xb6;
89 value = (addr & 0xff); 94 value=0x00;
90 if (flag & OPERA_READ_MSG) { 95 break;
91 value |= 0x01; 96 case ADDR_B601_VOLTAGE_18V:
97 request=0xb6;
98 value=0x01;
99 break;
100 case ADDR_B1A6_STREAM_CTRL:
101 request=0xb1;
102 value=0xa6;
103 break;
104 case ADDR_B880_READ_REMOTE:
105 request=0xb8;
106 value=0x80;
107 break;
108 default:
109 request=0xb1;
110 value=addr;
92 } 111 }
93 if (request == 0xa0) 112 ret = opera1_xilinx_rw(dev->udev, request,
94 value = 0xe600; 113 value, buf, len,
95 ret = opera1_xilinx_rw(dev->udev, request, value, buf, len, flag); 114 addr&0x01?OPERA_READ_MSG:OPERA_WRITE_MSG);
96 115
97 mutex_unlock(&dev->usb_mutex); 116 mutex_unlock(&dev->usb_mutex);
98 return ret; 117 return ret;
@@ -111,13 +130,10 @@ static int opera1_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
111 130
112 for (i = 0; i < num; i++) { 131 for (i = 0; i < num; i++) {
113 if ((tmp = opera1_usb_i2c_msgxfer(d, 132 if ((tmp = opera1_usb_i2c_msgxfer(d,
114 msg[i].addr, 133 (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0),
115 msg[i].buf, 134 msg[i].buf,
116 msg[i].len, 135 msg[i].len
117 (msg[i].flags == 136 )!= msg[i].len)) {
118 I2C_M_RD ?
119 OPERA_READ_MSG :
120 OPERA_WRITE_MSG))!= msg[i].len)) {
121 break; 137 break;
122 } 138 }
123 if (dvb_usb_opera1_debug & 0x10) 139 if (dvb_usb_opera1_debug & 0x10)
@@ -142,12 +158,12 @@ static int opera1_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
142 static u8 command_13v[1]={0x00}; 158 static u8 command_13v[1]={0x00};
143 static u8 command_18v[1]={0x01}; 159 static u8 command_18v[1]={0x01};
144 struct i2c_msg msg[] = { 160 struct i2c_msg msg[] = {
145 {.addr = 0xb600,.flags = 0,.buf = command_13v,.len = 1}, 161 {.addr = ADDR_B600_VOLTAGE_13V,.flags = 0,.buf = command_13v,.len = 1},
146 }; 162 };
147 struct dvb_usb_adapter *udev_adap = 163 struct dvb_usb_adapter *udev_adap =
148 (struct dvb_usb_adapter *)(fe->dvb->priv); 164 (struct dvb_usb_adapter *)(fe->dvb->priv);
149 if (voltage == SEC_VOLTAGE_18) { 165 if (voltage == SEC_VOLTAGE_18) {
150 msg[0].addr = 0xb601; 166 msg[0].addr = ADDR_B601_VOLTAGE_18V;
151 msg[0].buf = command_18v; 167 msg[0].buf = command_18v;
152 } 168 }
153 i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1); 169 i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1);
@@ -220,7 +236,7 @@ static u8 opera1_inittab[] = {
220}; 236};
221 237
222static struct stv0299_config opera1_stv0299_config = { 238static struct stv0299_config opera1_stv0299_config = {
223 .demod_address = 0xd0, 239 .demod_address = 0xd0>>1,
224 .min_delay_ms = 100, 240 .min_delay_ms = 100,
225 .mclk = 88000000UL, 241 .mclk = 88000000UL,
226 .invert = 1, 242 .invert = 1,
@@ -245,19 +261,21 @@ static int opera1_frontend_attach(struct dvb_usb_adapter *d)
245 261
246static int opera1_tuner_attach(struct dvb_usb_adapter *adap) 262static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
247{ 263{
248 adap->pll_addr = 0xc0; 264 dvb_attach(
249 adap->pll_desc = &dvb_pll_opera1; 265 dvb_pll_attach, adap->fe, 0xc0>>1,
250 adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; 266 &adap->dev->i2c_adap, &dvb_pll_opera1
267 );
251 return 0; 268 return 0;
252} 269}
253 270
254static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff) 271static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff)
255{ 272{
256 int addr = onoff ? 0xb701 : 0xb700;
257 u8 val = onoff ? 0x01 : 0x00; 273 u8 val = onoff ? 0x01 : 0x00;
274
258 if (dvb_usb_opera1_debug) 275 if (dvb_usb_opera1_debug)
259 info("power %s", onoff ? "on" : "off"); 276 info("power %s", onoff ? "on" : "off");
260 return opera1_usb_i2c_msgxfer(d, addr, &val, 1, OPERA_WRITE_MSG); 277 return opera1_xilinx_rw(d->udev, 0xb7, val,
278 &val, 1, OPERA_WRITE_MSG);
261} 279}
262 280
263static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) 281static 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)
265 static u8 buf_start[2] = { 0xff, 0x03 }; 283 static u8 buf_start[2] = { 0xff, 0x03 };
266 static u8 buf_stop[2] = { 0xff, 0x00 }; 284 static u8 buf_stop[2] = { 0xff, 0x00 };
267 struct i2c_msg start_tuner[] = { 285 struct i2c_msg start_tuner[] = {
268 {.addr = 0xb1a6,.buf = onoff ? buf_start : buf_stop,.len = 2}, 286 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = onoff ? buf_start : buf_stop,.len = 2},
269 }; 287 };
270 if (dvb_usb_opera1_debug) 288 if (dvb_usb_opera1_debug)
271 info("streaming %s", onoff ? "on" : "off"); 289 info("streaming %s", onoff ? "on" : "off");
@@ -278,7 +296,7 @@ static int opera1_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
278{ 296{
279 u8 b_pid[3]; 297 u8 b_pid[3];
280 struct i2c_msg msg[] = { 298 struct i2c_msg msg[] = {
281 {.addr = 0xb1a6,.buf = b_pid,.len = 3}, 299 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3},
282 }; 300 };
283 if (dvb_usb_opera1_debug) 301 if (dvb_usb_opera1_debug)
284 info("pidfilter index: %d pid: %d %s", index, pid, 302 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)
295 int u = 0x04; 313 int u = 0x04;
296 u8 b_pid[3]; 314 u8 b_pid[3];
297 struct i2c_msg msg[] = { 315 struct i2c_msg msg[] = {
298 {.addr = 0xb1a6,.buf = b_pid,.len = 3}, 316 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3},
299 }; 317 };
300 if (dvb_usb_opera1_debug) 318 if (dvb_usb_opera1_debug)
301 info("%s hw-pidfilter", onoff ? "enable" : "disable"); 319 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)
345 const u16 startmarker1 = 0x10ed; 363 const u16 startmarker1 = 0x10ed;
346 const u16 startmarker2 = 0x11ec; 364 const u16 startmarker2 = 0x11ec;
347 struct i2c_msg read_remote[] = { 365 struct i2c_msg read_remote[] = {
348 {.addr = 0xb880,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32}, 366 {.addr = ADDR_B880_READ_REMOTE,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32},
349 }; 367 };
350 int i = 0; 368 int i = 0;
351 u32 send_key = 0; 369 u32 send_key = 0;
@@ -467,7 +485,7 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev,
467static struct dvb_usb_device_properties opera1_properties = { 485static struct dvb_usb_device_properties opera1_properties = {
468 .caps = DVB_USB_IS_AN_I2C_ADAPTER, 486 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
469 .usb_ctrl = CYPRESS_FX2, 487 .usb_ctrl = CYPRESS_FX2,
470 .firmware = "opera.fw", 488 .firmware = "dvb-usb-opera-01.fw",
471 .size_of_priv = sizeof(struct opera1_state), 489 .size_of_priv = sizeof(struct opera1_state),
472 490
473 .power_ctrl = opera1_power_ctrl, 491 .power_ctrl = opera1_power_ctrl,
@@ -522,7 +540,7 @@ static int opera1_probe(struct usb_interface *intf,
522 if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && 540 if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM &&
523 udev->descriptor.idVendor == USB_VID_OPERA1 && 541 udev->descriptor.idVendor == USB_VID_OPERA1 &&
524 (d == NULL 542 (d == NULL
525 || opera1_xilinx_load_firmware(udev, "opera1-fpga.fw") != 0) 543 || opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga.fw") != 0)
526 ) { 544 ) {
527 return -EINVAL; 545 return -EINVAL;
528 } 546 }