iwlwifi: introduce host commands callbacks
[linux/fpc-iii.git] / drivers / media / dvb / dvb-usb / opera1.c
blob302cc67407c397e17091bc729c078e9d63f54031
1 /* DVB USB framework compliant Linux driver for the Opera1 DVB-S Card
3 * Copyright (C) 2006 Mario Hlawitschka (dh1pa@amsat.org)
4 * Copyright (C) 2006 Marco Gittler (g.marco@freenet.de)
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation, version 2.
10 * see Documentation/dvb/README.dvb-usb for more information
13 #define DVB_USB_LOG_PREFIX "opera"
15 #include "dvb-usb.h"
16 #include "stv0299.h"
18 #define OPERA_READ_MSG 0
19 #define OPERA_WRITE_MSG 1
20 #define OPERA_I2C_TUNER 0xd1
22 #define READ_FX2_REG_REQ 0xba
23 #define READ_MAC_ADDR 0x08
24 #define OPERA_WRITE_FX2 0xbb
25 #define OPERA_TUNER_REQ 0xb1
26 #define REG_1F_SYMBOLRATE_BYTE0 0x1f
27 #define REG_20_SYMBOLRATE_BYTE1 0x20
28 #define REG_21_SYMBOLRATE_BYTE2 0x21
30 #define ADDR_B600_VOLTAGE_13V (0x02)
31 #define ADDR_B601_VOLTAGE_18V (0x03)
32 #define ADDR_B1A6_STREAM_CTRL (0x04)
33 #define ADDR_B880_READ_REMOTE (0x05)
35 struct opera1_state {
36 u32 last_key_pressed;
38 struct opera_rc_keys {
39 u32 keycode;
40 u32 event;
43 static int dvb_usb_opera1_debug;
44 module_param_named(debug, dvb_usb_opera1_debug, int, 0644);
45 MODULE_PARM_DESC(debug,
46 "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))."
47 DVB_USB_DEBUG_STATUS);
49 static int opera1_xilinx_rw(struct usb_device *dev, u8 request, u16 value,
50 u8 * data, u16 len, int flags)
52 int ret;
53 u8 r;
54 u8 u8buf[len];
56 unsigned int pipe = (flags == OPERA_READ_MSG) ?
57 usb_rcvctrlpipe(dev,0) : usb_sndctrlpipe(dev, 0);
58 u8 request_type = (flags == OPERA_READ_MSG) ? USB_DIR_IN : USB_DIR_OUT;
60 if (flags == OPERA_WRITE_MSG)
61 memcpy(u8buf, data, len);
62 ret =
63 usb_control_msg(dev, pipe, request, request_type | USB_TYPE_VENDOR,
64 value, 0x0, u8buf, len, 2000);
66 if (request == OPERA_TUNER_REQ) {
67 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
68 OPERA_TUNER_REQ, USB_DIR_IN | USB_TYPE_VENDOR,
69 0x01, 0x0, &r, 1, 2000)<1 || r!=0x08)
70 return 0;
72 if (flags == OPERA_READ_MSG)
73 memcpy(data, u8buf, len);
74 return ret;
77 /* I2C */
79 static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr,
80 u8 * buf, u16 len)
82 int ret = 0;
83 u8 request;
84 u16 value;
86 if (!dev) {
87 info("no usb_device");
88 return -EINVAL;
90 if (mutex_lock_interruptible(&dev->usb_mutex) < 0)
91 return -EAGAIN;
93 switch (addr>>1){
94 case ADDR_B600_VOLTAGE_13V:
95 request=0xb6;
96 value=0x00;
97 break;
98 case ADDR_B601_VOLTAGE_18V:
99 request=0xb6;
100 value=0x01;
101 break;
102 case ADDR_B1A6_STREAM_CTRL:
103 request=0xb1;
104 value=0xa6;
105 break;
106 case ADDR_B880_READ_REMOTE:
107 request=0xb8;
108 value=0x80;
109 break;
110 default:
111 request=0xb1;
112 value=addr;
114 ret = opera1_xilinx_rw(dev->udev, request,
115 value, buf, len,
116 addr&0x01?OPERA_READ_MSG:OPERA_WRITE_MSG);
118 mutex_unlock(&dev->usb_mutex);
119 return ret;
122 static int opera1_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
123 int num)
125 struct dvb_usb_device *d = i2c_get_adapdata(adap);
126 int i = 0, tmp = 0;
128 if (!d)
129 return -ENODEV;
130 if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
131 return -EAGAIN;
133 for (i = 0; i < num; i++) {
134 if ((tmp = opera1_usb_i2c_msgxfer(d,
135 (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0),
136 msg[i].buf,
137 msg[i].len
138 )!= msg[i].len)) {
139 break;
141 if (dvb_usb_opera1_debug & 0x10)
142 info("sending i2c mesage %d %d", tmp, msg[i].len);
144 mutex_unlock(&d->i2c_mutex);
145 return num;
148 static u32 opera1_i2c_func(struct i2c_adapter *adapter)
150 return I2C_FUNC_I2C;
153 static struct i2c_algorithm opera1_i2c_algo = {
154 .master_xfer = opera1_i2c_xfer,
155 .functionality = opera1_i2c_func,
158 static int opera1_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
160 static u8 command_13v[1]={0x00};
161 static u8 command_18v[1]={0x01};
162 struct i2c_msg msg[] = {
163 {.addr = ADDR_B600_VOLTAGE_13V,.flags = 0,.buf = command_13v,.len = 1},
165 struct dvb_usb_adapter *udev_adap =
166 (struct dvb_usb_adapter *)(fe->dvb->priv);
167 if (voltage == SEC_VOLTAGE_18) {
168 msg[0].addr = ADDR_B601_VOLTAGE_18V;
169 msg[0].buf = command_18v;
171 i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1);
172 return 0;
175 static int opera1_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate,
176 u32 ratio)
178 stv0299_writereg(fe, 0x13, 0x98);
179 stv0299_writereg(fe, 0x14, 0x95);
180 stv0299_writereg(fe, REG_1F_SYMBOLRATE_BYTE0, (ratio >> 16) & 0xff);
181 stv0299_writereg(fe, REG_20_SYMBOLRATE_BYTE1, (ratio >> 8) & 0xff);
182 stv0299_writereg(fe, REG_21_SYMBOLRATE_BYTE2, (ratio) & 0xf0);
183 return 0;
186 static u8 opera1_inittab[] = {
187 0x00, 0xa1,
188 0x01, 0x15,
189 0x02, 0x00,
190 0x03, 0x00,
191 0x04, 0x7d,
192 0x05, 0x05,
193 0x06, 0x02,
194 0x07, 0x00,
195 0x0b, 0x00,
196 0x0c, 0x01,
197 0x0d, 0x81,
198 0x0e, 0x44,
199 0x0f, 0x19,
200 0x10, 0x3f,
201 0x11, 0x84,
202 0x12, 0xda,
203 0x13, 0x98,
204 0x14, 0x95,
205 0x15, 0xc9,
206 0x16, 0xeb,
207 0x17, 0x00,
208 0x18, 0x19,
209 0x19, 0x8b,
210 0x1a, 0x00,
211 0x1b, 0x82,
212 0x1c, 0x7f,
213 0x1d, 0x00,
214 0x1e, 0x00,
215 REG_1F_SYMBOLRATE_BYTE0, 0x06,
216 REG_20_SYMBOLRATE_BYTE1, 0x50,
217 REG_21_SYMBOLRATE_BYTE2, 0x10,
218 0x22, 0x00,
219 0x23, 0x00,
220 0x24, 0x37,
221 0x25, 0xbc,
222 0x26, 0x00,
223 0x27, 0x00,
224 0x28, 0x00,
225 0x29, 0x1e,
226 0x2a, 0x14,
227 0x2b, 0x1f,
228 0x2c, 0x09,
229 0x2d, 0x0a,
230 0x2e, 0x00,
231 0x2f, 0x00,
232 0x30, 0x00,
233 0x31, 0x1f,
234 0x32, 0x19,
235 0x33, 0xfc,
236 0x34, 0x13,
237 0xff, 0xff,
240 static struct stv0299_config opera1_stv0299_config = {
241 .demod_address = 0xd0>>1,
242 .min_delay_ms = 100,
243 .mclk = 88000000UL,
244 .invert = 1,
245 .skip_reinit = 0,
246 .lock_output = STV0229_LOCKOUTPUT_0,
247 .volt13_op0_op1 = STV0299_VOLT13_OP0,
248 .inittab = opera1_inittab,
249 .set_symbol_rate = opera1_stv0299_set_symbol_rate,
252 static int opera1_frontend_attach(struct dvb_usb_adapter *d)
254 if ((d->fe =
255 dvb_attach(stv0299_attach, &opera1_stv0299_config,
256 &d->dev->i2c_adap)) != NULL) {
257 d->fe->ops.set_voltage = opera1_set_voltage;
258 return 0;
260 info("not attached stv0299");
261 return -EIO;
264 static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
266 dvb_attach(
267 dvb_pll_attach, adap->fe, 0xc0>>1,
268 &adap->dev->i2c_adap, DVB_PLL_OPERA1
270 return 0;
273 static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff)
275 u8 val = onoff ? 0x01 : 0x00;
277 if (dvb_usb_opera1_debug)
278 info("power %s", onoff ? "on" : "off");
279 return opera1_xilinx_rw(d->udev, 0xb7, val,
280 &val, 1, OPERA_WRITE_MSG);
283 static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
285 static u8 buf_start[2] = { 0xff, 0x03 };
286 static u8 buf_stop[2] = { 0xff, 0x00 };
287 struct i2c_msg start_tuner[] = {
288 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = onoff ? buf_start : buf_stop,.len = 2},
290 if (dvb_usb_opera1_debug)
291 info("streaming %s", onoff ? "on" : "off");
292 i2c_transfer(&adap->dev->i2c_adap, start_tuner, 1);
293 return 0;
296 static int opera1_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
297 int onoff)
299 u8 b_pid[3];
300 struct i2c_msg msg[] = {
301 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3},
303 if (dvb_usb_opera1_debug)
304 info("pidfilter index: %d pid: %d %s", index, pid,
305 onoff ? "on" : "off");
306 b_pid[0] = (2 * index) + 4;
307 b_pid[1] = onoff ? (pid & 0xff) : (0x00);
308 b_pid[2] = onoff ? ((pid >> 8) & 0xff) : (0x00);
309 i2c_transfer(&adap->dev->i2c_adap, msg, 1);
310 return 0;
313 static int opera1_pid_filter_control(struct dvb_usb_adapter *adap, int onoff)
315 int u = 0x04;
316 u8 b_pid[3];
317 struct i2c_msg msg[] = {
318 {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3},
320 if (dvb_usb_opera1_debug)
321 info("%s hw-pidfilter", onoff ? "enable" : "disable");
322 for (; u < 0x7e; u += 2) {
323 b_pid[0] = u;
324 b_pid[1] = 0;
325 b_pid[2] = 0x80;
326 i2c_transfer(&adap->dev->i2c_adap, msg, 1);
328 return 0;
331 static struct dvb_usb_rc_key opera1_rc_keys[] = {
332 {0x5f, 0xa0, KEY_1},
333 {0x51, 0xaf, KEY_2},
334 {0x5d, 0xa2, KEY_3},
335 {0x41, 0xbe, KEY_4},
336 {0x0b, 0xf5, KEY_5},
337 {0x43, 0xbd, KEY_6},
338 {0x47, 0xb8, KEY_7},
339 {0x49, 0xb6, KEY_8},
340 {0x05, 0xfa, KEY_9},
341 {0x45, 0xba, KEY_0},
342 {0x09, 0xf6, KEY_UP}, /*chanup */
343 {0x1b, 0xe5, KEY_DOWN}, /*chandown */
344 {0x5d, 0xa3, KEY_LEFT}, /*voldown */
345 {0x5f, 0xa1, KEY_RIGHT}, /*volup */
346 {0x07, 0xf8, KEY_SPACE}, /*tab */
347 {0x1f, 0xe1, KEY_ENTER}, /*play ok */
348 {0x1b, 0xe4, KEY_Z}, /*zoom */
349 {0x59, 0xa6, KEY_M}, /*mute */
350 {0x5b, 0xa5, KEY_F}, /*tv/f */
351 {0x19, 0xe7, KEY_R}, /*rec */
352 {0x01, 0xfe, KEY_S}, /*Stop */
353 {0x03, 0xfd, KEY_P}, /*pause */
354 {0x03, 0xfc, KEY_W}, /*<- -> */
355 {0x07, 0xf9, KEY_C}, /*capture */
356 {0x47, 0xb9, KEY_Q}, /*exit */
357 {0x43, 0xbc, KEY_O}, /*power */
361 static int opera1_rc_query(struct dvb_usb_device *dev, u32 * event, int *state)
363 struct opera1_state *opst = dev->priv;
364 u8 rcbuffer[32];
365 const u16 startmarker1 = 0x10ed;
366 const u16 startmarker2 = 0x11ec;
367 struct i2c_msg read_remote[] = {
368 {.addr = ADDR_B880_READ_REMOTE,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32},
370 int i = 0;
371 u32 send_key = 0;
373 if (i2c_transfer(&dev->i2c_adap, read_remote, 1) == 1) {
374 for (i = 0; i < 32; i++) {
375 if (rcbuffer[i])
376 send_key |= 1;
377 if (i < 31)
378 send_key = send_key << 1;
380 if (send_key & 0x8000)
381 send_key = (send_key << 1) | (send_key >> 15 & 0x01);
383 if (send_key == 0xffff && opst->last_key_pressed != 0) {
384 *state = REMOTE_KEY_REPEAT;
385 *event = opst->last_key_pressed;
386 return 0;
388 for (; send_key != 0;) {
389 if (send_key >> 16 == startmarker2) {
390 break;
391 } else if (send_key >> 16 == startmarker1) {
392 send_key =
393 (send_key & 0xfffeffff) | (startmarker1 << 16);
394 break;
395 } else
396 send_key >>= 1;
399 if (send_key == 0)
400 return 0;
402 send_key = (send_key & 0xffff) | 0x0100;
404 for (i = 0; i < ARRAY_SIZE(opera1_rc_keys); i++) {
405 if ((opera1_rc_keys[i].custom * 256 +
406 opera1_rc_keys[i].data) == (send_key & 0xffff)) {
407 *state = REMOTE_KEY_PRESSED;
408 *event = opera1_rc_keys[i].event;
409 opst->last_key_pressed =
410 opera1_rc_keys[i].event;
411 break;
413 opst->last_key_pressed = 0;
415 } else
416 *state = REMOTE_NO_KEY_PRESSED;
417 return 0;
420 static struct usb_device_id opera1_table[] = {
421 {USB_DEVICE(USB_VID_CYPRESS, USB_PID_OPERA1_COLD)},
422 {USB_DEVICE(USB_VID_OPERA1, USB_PID_OPERA1_WARM)},
426 MODULE_DEVICE_TABLE(usb, opera1_table);
428 static int opera1_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
430 u8 command[] = { READ_MAC_ADDR };
431 opera1_xilinx_rw(d->udev, 0xb1, 0xa0, command, 1, OPERA_WRITE_MSG);
432 opera1_xilinx_rw(d->udev, 0xb1, 0xa1, mac, 6, OPERA_READ_MSG);
433 return 0;
435 static int opera1_xilinx_load_firmware(struct usb_device *dev,
436 const char *filename)
438 const struct firmware *fw = NULL;
439 u8 *b, *p;
440 int ret = 0, i,fpgasize=40;
441 u8 testval;
442 info("start downloading fpga firmware %s",filename);
444 if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) {
445 err("did not find the firmware file. (%s) "
446 "Please see linux/Documentation/dvb/ for more details on firmware-problems.",
447 filename);
448 return ret;
449 } else {
450 p = kmalloc(fw->size, GFP_KERNEL);
451 opera1_xilinx_rw(dev, 0xbc, 0x00, &testval, 1, OPERA_READ_MSG);
452 if (p != NULL && testval != 0x67) {
454 u8 reset = 0, fpga_command = 0;
455 memcpy(p, fw->data, fw->size);
456 /* clear fpga ? */
457 opera1_xilinx_rw(dev, 0xbc, 0xaa, &fpga_command, 1,
458 OPERA_WRITE_MSG);
459 for (i = 0; i < fw->size;) {
460 if ( (fw->size - i) <fpgasize){
461 fpgasize=fw->size-i;
463 b = (u8 *) p + i;
464 if (opera1_xilinx_rw
465 (dev, OPERA_WRITE_FX2, 0x0, b , fpgasize,
466 OPERA_WRITE_MSG) != fpgasize
468 err("error while transferring firmware");
469 ret = -EINVAL;
470 break;
472 i = i + fpgasize;
474 /* restart the CPU */
475 if (ret || opera1_xilinx_rw
476 (dev, 0xa0, 0xe600, &reset, 1,
477 OPERA_WRITE_MSG) != 1) {
478 err("could not restart the USB controller CPU.");
479 ret = -EINVAL;
483 kfree(p);
484 if (fw) {
485 release_firmware(fw);
487 return ret;
490 static struct dvb_usb_device_properties opera1_properties = {
491 .caps = DVB_USB_IS_AN_I2C_ADAPTER,
492 .usb_ctrl = CYPRESS_FX2,
493 .firmware = "dvb-usb-opera-01.fw",
494 .size_of_priv = sizeof(struct opera1_state),
496 .power_ctrl = opera1_power_ctrl,
497 .i2c_algo = &opera1_i2c_algo,
499 .rc_key_map = opera1_rc_keys,
500 .rc_key_map_size = ARRAY_SIZE(opera1_rc_keys),
501 .rc_interval = 200,
502 .rc_query = opera1_rc_query,
503 .read_mac_address = opera1_read_mac_address,
504 .generic_bulk_ctrl_endpoint = 0x00,
505 /* parameter for the MPEG2-data transfer */
506 .num_adapters = 1,
507 .adapter = {
509 .frontend_attach = opera1_frontend_attach,
510 .streaming_ctrl = opera1_streaming_ctrl,
511 .tuner_attach = opera1_tuner_attach,
512 .caps =
513 DVB_USB_ADAP_HAS_PID_FILTER |
514 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
515 .pid_filter = opera1_pid_filter,
516 .pid_filter_ctrl = opera1_pid_filter_control,
517 .pid_filter_count = 252,
518 .stream = {
519 .type = USB_BULK,
520 .count = 10,
521 .endpoint = 0x82,
522 .u = {
523 .bulk = {
524 .buffersize = 4096,
530 .num_device_descs = 1,
531 .devices = {
532 {"Opera1 DVB-S USB2.0",
533 {&opera1_table[0], NULL},
534 {&opera1_table[1], NULL},
539 static int opera1_probe(struct usb_interface *intf,
540 const struct usb_device_id *id)
542 struct usb_device *udev = interface_to_usbdev(intf);
544 if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM &&
545 udev->descriptor.idVendor == USB_VID_OPERA1 &&
546 opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga-01.fw") != 0
548 return -EINVAL;
551 if (dvb_usb_device_init(intf, &opera1_properties, THIS_MODULE, NULL) != 0)
552 return -EINVAL;
553 return 0;
556 static struct usb_driver opera1_driver = {
557 .name = "opera1",
558 .probe = opera1_probe,
559 .disconnect = dvb_usb_device_exit,
560 .id_table = opera1_table,
563 static int __init opera1_module_init(void)
565 int result = 0;
566 if ((result = usb_register(&opera1_driver))) {
567 err("usb_register failed. Error number %d", result);
569 return result;
572 static void __exit opera1_module_exit(void)
574 usb_deregister(&opera1_driver);
577 module_init(opera1_module_init);
578 module_exit(opera1_module_exit);
580 MODULE_AUTHOR("Mario Hlawitschka (c) dh1pa@amsat.org");
581 MODULE_AUTHOR("Marco Gittler (c) g.marco@freenet.de");
582 MODULE_DESCRIPTION("Driver for Opera1 DVB-S device");
583 MODULE_VERSION("0.1");
584 MODULE_LICENSE("GPL");