2 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
4 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
10 #include <linux/kernel.h>
11 #include <linux/i2c.h>
12 #include <linux/mutex.h>
15 #include "dvb_frontend.h"
18 #include "dibx000_common.h"
21 module_param(debug
, int, 0644);
22 MODULE_PARM_DESC(debug
, "turn on debugging (default: 0)");
24 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB9000: "); printk(args); printk("\n"); } } while (0)
25 #define MAX_NUMBER_OF_FRONTENDS 6
28 struct i2c_adapter
*i2c_adap
;
35 #define DIB_LOCK struct mutex
36 #define DibAcquireLock(lock) do { if (mutex_lock_interruptible(lock) < 0) dprintk("could not get the lock"); } while (0)
37 #define DibReleaseLock(lock) mutex_unlock(lock)
38 #define DibInitLock(lock) mutex_init(lock)
39 #define DibFreeLock(lock)
41 struct dib9000_pid_ctrl
{
42 #define DIB9000_PID_FILTER_CTRL 0
43 #define DIB9000_PID_FILTER 1
50 struct dib9000_state
{
51 struct i2c_device i2c
;
53 struct dibx000_i2c_master i2c_master
;
54 struct i2c_adapter tuner_adap
;
55 struct i2c_adapter component_bus
;
60 enum frontend_tune_state tune_state
;
62 struct dvb_frontend_parametersContext channel_status
;
66 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
68 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
70 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
73 union { /* common for all chips */
79 struct dib9000_fe_memory_map
{
85 DIB_LOCK mbx_if_lock
; /* to protect read/write operations */
86 DIB_LOCK mbx_lock
; /* to protect the whole mailbox handling */
88 DIB_LOCK mem_lock
; /* to protect the memory accesses */
89 DIB_LOCK mem_mbx_lock
; /* to protect the memory-based mailbox */
91 #define MBX_MAX_WORDS (256 - 200 - 2)
92 #define DIB9000_MSG_CACHE_SIZE 2
93 u16 message_cache
[DIB9000_MSG_CACHE_SIZE
][MBX_MAX_WORDS
];
98 union { /* common for all platforms */
100 struct dib9000_config cfg
;
104 struct dvb_frontend
*fe
[MAX_NUMBER_OF_FRONTENDS
];
105 u16 component_bus_speed
;
107 /* for the I2C transfer */
108 struct i2c_msg msg
[2];
109 u8 i2c_write_buffer
[255];
110 u8 i2c_read_buffer
[255];
112 u8 get_frontend_internal
;
113 struct dib9000_pid_ctrl pid_ctrl
[10];
114 s8 pid_ctrl_index
; /* -1: empty list; -2: do not use the list */
117 static const u32 fe_info
[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0
122 enum dib9000_power_mode
{
123 DIB9000_POWER_ALL
= 0,
126 DIB9000_POWER_INTERF_ANALOG_AGC
,
127 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
,
128 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
,
129 DIB9000_POWER_INTERFACE_ONLY
,
132 enum dib9000_out_messages
{
134 OUT_MSG_HOST_BUF_FAIL
,
136 OUT_MSG_BRIDGE_I2C_W
,
137 OUT_MSG_BRIDGE_I2C_R
,
138 OUT_MSG_BRIDGE_APB_W
,
139 OUT_MSG_BRIDGE_APB_R
,
140 OUT_MSG_SCAN_CHANNEL
,
145 OUT_MSG_ENABLE_TIME_SLICE
,
147 OUT_MSG_FE_CHANNEL_SEARCH
,
148 OUT_MSG_FE_CHANNEL_TUNE
,
156 OUT_MSG_ENABLE_DIVERSITY
,
157 OUT_MSG_SET_OUTPUT_MODE
,
158 OUT_MSG_SET_PRIORITARY_CHANNEL
,
163 enum dib9000_in_messages
{
167 IN_MSG_ACK_FREE_ITEM
,
170 IN_MSG_RAWTS_MONITOR
,
171 IN_MSG_END_BRIDGE_I2C_RW
,
172 IN_MSG_END_BRIDGE_APB_RW
,
177 IN_MSG_FE_FW_DL_DONE
,
179 IN_MSG_ACK_CHANGE_SVC
,
183 /* memory_access requests */
184 #define FE_MM_W_CHANNEL 0
185 #define FE_MM_W_FE_INFO 1
186 #define FE_MM_RW_SYNC 2
188 #define FE_SYNC_CHANNEL 1
189 #define FE_SYNC_W_GENERIC_MONIT 2
190 #define FE_SYNC_COMPONENT_ACCESS 3
192 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
193 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
194 #define FE_MM_R_FE_INFO 5
195 #define FE_MM_R_FE_MONITOR 6
197 #define FE_MM_W_CHANNEL_HEAD 7
198 #define FE_MM_W_CHANNEL_UNION 8
199 #define FE_MM_W_CHANNEL_CONTEXT 9
200 #define FE_MM_R_CHANNEL_UNION 10
201 #define FE_MM_R_CHANNEL_CONTEXT 11
202 #define FE_MM_R_CHANNEL_TUNE_STATE 12
204 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
205 #define FE_MM_W_GENERIC_MONITORING 14
206 #define FE_MM_R_GENERIC_MONITORING 15
208 #define FE_MM_W_COMPONENT_ACCESS 16
209 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
210 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
);
211 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
);
213 static u16
to_fw_output_mode(u16 mode
)
218 case OUTMODE_MPEG2_PAR_GATED_CLK
:
220 case OUTMODE_MPEG2_PAR_CONT_CLK
:
222 case OUTMODE_MPEG2_SERIAL
:
224 case OUTMODE_DIVERSITY
:
226 case OUTMODE_MPEG2_FIFO
:
228 case OUTMODE_ANALOG_ADC
:
235 static u16
dib9000_read16_attr(struct dib9000_state
*state
, u16 reg
, u8
* b
, u32 len
, u16 attribute
)
237 u32 chunk_size
= 126;
241 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024))
242 return dib9000_risc_apb_access_read(state
, reg
, attribute
, NULL
, 0, b
, len
);
244 memset(state
->msg
, 0, 2 * sizeof(struct i2c_msg
));
245 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
246 state
->msg
[0].flags
= 0;
247 state
->msg
[0].buf
= state
->i2c_write_buffer
;
248 state
->msg
[0].len
= 2;
249 state
->msg
[1].addr
= state
->i2c
.i2c_addr
>> 1;
250 state
->msg
[1].flags
= I2C_M_RD
;
251 state
->msg
[1].buf
= b
;
252 state
->msg
[1].len
= len
;
254 state
->i2c_write_buffer
[0] = reg
>> 8;
255 state
->i2c_write_buffer
[1] = reg
& 0xff;
257 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
258 state
->i2c_write_buffer
[0] |= (1 << 5);
259 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
260 state
->i2c_write_buffer
[0] |= (1 << 4);
263 l
= len
< chunk_size
? len
: chunk_size
;
264 state
->msg
[1].len
= l
;
265 state
->msg
[1].buf
= b
;
266 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 2) != 2 ? -EREMOTEIO
: 0;
268 dprintk("i2c read error on %d", reg
);
275 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
277 } while ((ret
== 0) && len
);
282 static u16
dib9000_i2c_read16(struct i2c_device
*i2c
, u16 reg
)
284 struct i2c_msg msg
[2] = {
285 {.addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
286 .buf
= i2c
->i2c_write_buffer
, .len
= 2},
287 {.addr
= i2c
->i2c_addr
>> 1, .flags
= I2C_M_RD
,
288 .buf
= i2c
->i2c_read_buffer
, .len
= 2},
291 i2c
->i2c_write_buffer
[0] = reg
>> 8;
292 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
294 if (i2c_transfer(i2c
->i2c_adap
, msg
, 2) != 2) {
295 dprintk("read register %x error", reg
);
299 return (i2c
->i2c_read_buffer
[0] << 8) | i2c
->i2c_read_buffer
[1];
302 static inline u16
dib9000_read_word(struct dib9000_state
*state
, u16 reg
)
304 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2, 0) != 0)
306 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
309 static inline u16
dib9000_read_word_attr(struct dib9000_state
*state
, u16 reg
, u16 attribute
)
311 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2,
314 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
317 #define dib9000_read16_noinc_attr(state, reg, b, len, attribute) dib9000_read16_attr(state, reg, b, len, (attribute) | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
319 static u16
dib9000_write16_attr(struct dib9000_state
*state
, u16 reg
, const u8
* buf
, u32 len
, u16 attribute
)
321 u32 chunk_size
= 126;
325 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024)) {
326 if (dib9000_risc_apb_access_write
327 (state
, reg
, DATA_BUS_ACCESS_MODE_16BIT
| DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
| attribute
, buf
, len
) != 0)
332 memset(&state
->msg
[0], 0, sizeof(struct i2c_msg
));
333 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
334 state
->msg
[0].flags
= 0;
335 state
->msg
[0].buf
= state
->i2c_write_buffer
;
336 state
->msg
[0].len
= len
+ 2;
338 state
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
339 state
->i2c_write_buffer
[1] = (reg
) & 0xff;
341 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
342 state
->i2c_write_buffer
[0] |= (1 << 5);
343 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
344 state
->i2c_write_buffer
[0] |= (1 << 4);
347 l
= len
< chunk_size
? len
: chunk_size
;
348 state
->msg
[0].len
= l
+ 2;
349 memcpy(&state
->i2c_write_buffer
[2], buf
, l
);
351 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 1) != 1 ? -EREMOTEIO
: 0;
356 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
358 } while ((ret
== 0) && len
);
363 static int dib9000_i2c_write16(struct i2c_device
*i2c
, u16 reg
, u16 val
)
365 struct i2c_msg msg
= {
366 .addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
367 .buf
= i2c
->i2c_write_buffer
, .len
= 4
370 i2c
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
371 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
372 i2c
->i2c_write_buffer
[2] = (val
>> 8) & 0xff;
373 i2c
->i2c_write_buffer
[3] = val
& 0xff;
375 return i2c_transfer(i2c
->i2c_adap
, &msg
, 1) != 1 ? -EREMOTEIO
: 0;
378 static inline int dib9000_write_word(struct dib9000_state
*state
, u16 reg
, u16 val
)
380 u8 b
[2] = { val
>> 8, val
& 0xff };
381 return dib9000_write16_attr(state
, reg
, b
, 2, 0);
384 static inline int dib9000_write_word_attr(struct dib9000_state
*state
, u16 reg
, u16 val
, u16 attribute
)
386 u8 b
[2] = { val
>> 8, val
& 0xff };
387 return dib9000_write16_attr(state
, reg
, b
, 2, attribute
);
390 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
391 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
392 #define dib9000_write16_noinc_attr(state, reg, buf, len, attribute) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT | (attribute))
394 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
395 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
397 #define MAC_IRQ (1 << 1)
398 #define IRQ_POL_MSK (1 << 4)
400 #define dib9000_risc_mem_read_chunks(state, b, len) dib9000_read16_attr(state, 1063, b, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
401 #define dib9000_risc_mem_write_chunks(state, buf, len) dib9000_write16_attr(state, 1063, buf, len, DATA_BUS_ACCESS_MODE_8BIT | DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
403 static void dib9000_risc_mem_setup_cmd(struct dib9000_state
*state
, u32 addr
, u32 len
, u8 reading
)
407 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
413 b
[4] = (u8
) (addr
>> 8);
414 b
[5] = (u8
) (addr
& 0xff);
418 b
[12] = (u8
) (addr
>> 8);
419 b
[13] = (u8
) (addr
& 0xff);
424 b
[8] = (u8
) (addr
>> 8);
425 b
[9] = (u8
) (addr
& 0xff);
427 dib9000_write(state
, 1056, b
, 14);
429 dib9000_write_word(state
, 1056, (1 << 15) | 1);
430 state
->platform
.risc
.memcmd
= -1; /* if it was called directly reset it - to force a future setup-call to set it */
433 static void dib9000_risc_mem_setup(struct dib9000_state
*state
, u8 cmd
)
435 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
& 0x7f];
436 /* decide whether we need to "refresh" the memory controller */
437 if (state
->platform
.risc
.memcmd
== cmd
&& /* same command */
438 !(cmd
& 0x80 && m
->size
< 67)) /* and we do not want to read something with less than 67 bytes looping - working around a bug in the memory controller */
440 dib9000_risc_mem_setup_cmd(state
, m
->addr
, m
->size
, cmd
& 0x80);
441 state
->platform
.risc
.memcmd
= cmd
;
444 static int dib9000_risc_mem_read(struct dib9000_state
*state
, u8 cmd
, u8
* b
, u16 len
)
446 if (!state
->platform
.risc
.fw_is_running
)
449 DibAcquireLock(&state
->platform
.risc
.mem_lock
);
450 dib9000_risc_mem_setup(state
, cmd
| 0x80);
451 dib9000_risc_mem_read_chunks(state
, b
, len
);
452 DibReleaseLock(&state
->platform
.risc
.mem_lock
);
456 static int dib9000_risc_mem_write(struct dib9000_state
*state
, u8 cmd
, const u8
* b
)
458 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
];
459 if (!state
->platform
.risc
.fw_is_running
)
462 DibAcquireLock(&state
->platform
.risc
.mem_lock
);
463 dib9000_risc_mem_setup(state
, cmd
);
464 dib9000_risc_mem_write_chunks(state
, b
, m
->size
);
465 DibReleaseLock(&state
->platform
.risc
.mem_lock
);
469 static int dib9000_firmware_download(struct dib9000_state
*state
, u8 risc_id
, u16 key
, const u8
* code
, u32 len
)
478 /* config crtl reg */
479 dib9000_write_word(state
, 1024 + offs
, 0x000f);
480 dib9000_write_word(state
, 1025 + offs
, 0);
481 dib9000_write_word(state
, 1031 + offs
, key
);
483 dprintk("going to download %dB of microcode", len
);
484 if (dib9000_write16_noinc(state
, 1026 + offs
, (u8
*) code
, (u16
) len
) != 0) {
485 dprintk("error while downloading microcode for RISC %c", 'A' + risc_id
);
489 dprintk("Microcode for RISC %c loaded", 'A' + risc_id
);
494 static int dib9000_mbx_host_init(struct dib9000_state
*state
, u8 risc_id
)
506 dib9000_write_word(state
, 1027 + mbox_offs
, 0x8000);
508 /* Read reset status */
510 reset_reg
= dib9000_read_word(state
, 1027 + mbox_offs
);
512 } while ((reset_reg
& 0x8000) && --tries
);
514 if (reset_reg
& 0x8000) {
515 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id
);
518 dprintk("MBX: initialized");
522 #define MAX_MAILBOX_TRY 100
523 static int dib9000_mbx_send_attr(struct dib9000_state
*state
, u8 id
, u16
* data
, u8 len
, u16 attr
)
531 if (!state
->platform
.risc
.fw_is_running
)
534 DibAcquireLock(&state
->platform
.risc
.mbx_if_lock
);
535 tmp
= MAX_MAILBOX_TRY
;
537 size
= dib9000_read_word_attr(state
, 1043, attr
) & 0xff;
538 if ((size
+ len
+ 1) > MBX_MAX_WORDS
&& --tmp
) {
539 dprintk("MBX: RISC mbx full, retrying");
545 /*dprintk( "MBX: size: %d", size); */
552 dprintk("--> %02x %d ", id
, len
+ 1);
553 for (i
= 0; i
< len
; i
++)
554 dprintk("%04x ", data
[i
]);
558 /* byte-order conversion - works on big (where it is not necessary) or little endian */
560 for (i
= 0; i
< len
; i
++) {
569 if (dib9000_write16_noinc_attr(state
, 1045, b
, 2, attr
) != 0 || dib9000_write16_noinc_attr(state
, 1045, (u8
*) data
, len
* 2, attr
) != 0) {
574 /* update register nb_mes_in_RX */
575 ret
= (u8
) dib9000_write_word_attr(state
, 1043, 1 << 14, attr
);
578 DibReleaseLock(&state
->platform
.risc
.mbx_if_lock
);
583 static u8
dib9000_mbx_read(struct dib9000_state
*state
, u16
* data
, u8 risc_id
, u16 attr
)
593 if (!state
->platform
.risc
.fw_is_running
)
596 DibAcquireLock(&state
->platform
.risc
.mbx_if_lock
);
602 /* Length and type in the first word */
603 *data
= dib9000_read_word_attr(state
, 1029 + mc_base
, attr
);
606 if (size
<= MBX_MAX_WORDS
) {
608 size
--; /* Initial word already read */
610 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, size
* 2, attr
);
612 /* to word conversion */
613 for (i
= 0; i
< size
; i
++) {
615 *data
= (tmp
>> 8) | (tmp
<< 8);
621 for (i
= 0; i
< size
+ 1; i
++)
622 dprintk("%04x ", d
[i
]);
626 dprintk("MBX: message is too big for message cache (%d), flushing message", size
);
627 size
--; /* Initial word already read */
629 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, 2, attr
);
631 /* Update register nb_mes_in_TX */
632 dib9000_write_word_attr(state
, 1028 + mc_base
, 1 << 14, attr
);
634 DibReleaseLock(&state
->platform
.risc
.mbx_if_lock
);
639 static int dib9000_risc_debug_buf(struct dib9000_state
*state
, u16
* data
, u8 size
)
641 u32 ts
= data
[1] << 16 | data
[0];
642 char *b
= (char *)&data
[2];
644 b
[2 * (size
- 2) - 1] = '\0'; /* Bullet proof the buffer */
649 dprintk("RISC%d: %d.%04d %s", state
->fe_id
, ts
/ 10000, ts
% 10000, *b
? b
: "<emtpy>");
653 static int dib9000_mbx_fetch_to_cache(struct dib9000_state
*state
, u16 attr
)
658 /* find a free slot */
659 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
660 block
= state
->platform
.risc
.message_cache
[i
];
662 size
= dib9000_mbx_read(state
, block
, 1, attr
);
664 /* dprintk( "MBX: fetched %04x message to cache", *block); */
666 switch (*block
>> 8) {
667 case IN_MSG_DEBUG_BUF
:
668 dib9000_risc_debug_buf(state
, block
+ 1, size
); /* debug-messages are going to be printed right away */
669 *block
= 0; /* free the block */
672 case IN_MSG_DATA
: /* FE-TRACE */
673 dib9000_risc_data_process(state
, block
+ 1, size
);
684 dprintk("MBX: no free cache-slot found for new message...");
688 static u8
dib9000_mbx_count(struct dib9000_state
*state
, u8 risc_id
, u16 attr
)
691 return (u8
) (dib9000_read_word_attr(state
, 1028, attr
) >> 10) & 0x1f; /* 5 bit field */
693 return (u8
) (dib9000_read_word_attr(state
, 1044, attr
) >> 8) & 0x7f; /* 7 bit field */
696 static int dib9000_mbx_process(struct dib9000_state
*state
, u16 attr
)
701 if (!state
->platform
.risc
.fw_is_running
)
704 DibAcquireLock(&state
->platform
.risc
.mbx_lock
);
706 if (dib9000_mbx_count(state
, 1, attr
)) /* 1=RiscB */
707 ret
= dib9000_mbx_fetch_to_cache(state
, attr
);
709 tmp
= dib9000_read_word_attr(state
, 1229, attr
); /* Clear the IRQ */
711 /* dprintk( "cleared IRQ: %x", tmp); */
712 DibReleaseLock(&state
->platform
.risc
.mbx_lock
);
717 static int dib9000_mbx_get_message_attr(struct dib9000_state
*state
, u16 id
, u16
* msg
, u8
* size
, u16 attr
)
725 /* dib9000_mbx_get_from_cache(); */
726 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
727 block
= state
->platform
.risc
.message_cache
[i
];
728 if ((*block
>> 8) == id
) {
729 *size
= (*block
& 0xff) - 1;
730 memcpy(msg
, block
+ 1, (*size
) * 2);
731 *block
= 0; /* free the block */
732 i
= 0; /* signal that we found a message */
740 if (dib9000_mbx_process(state
, attr
) == -1) /* try to fetch one message - if any */
746 dprintk("waiting for message %d timed out", id
);
753 static int dib9000_risc_check_version(struct dib9000_state
*state
)
759 if (dib9000_mbx_send(state
, OUT_MSG_REQ_VERSION
, &fw_version
, 1) != 0)
762 if (dib9000_mbx_get_message(state
, IN_MSG_VERSION
, (u16
*) r
, &size
) < 0)
765 fw_version
= (r
[0] << 8) | r
[1];
766 dprintk("RISC: ver: %d.%02d (IC: %d)", fw_version
>> 10, fw_version
& 0x3ff, (r
[2] << 8) | r
[3]);
768 if ((fw_version
>> 10) != 7)
771 switch (fw_version
& 0x3ff) {
780 dprintk("RISC: invalid firmware version");
784 dprintk("RISC: valid firmware version");
788 static int dib9000_fw_boot(struct dib9000_state
*state
, const u8
* codeA
, u32 lenA
, const u8
* codeB
, u32 lenB
)
790 /* Reconfig pool mac ram */
791 dib9000_write_word(state
, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
792 dib9000_write_word(state
, 1226, 0x05);
794 /* Toggles IP crypto to Host APB interface. */
795 dib9000_write_word(state
, 1542, 1);
797 /* Set jump and no jump in the dma box */
798 dib9000_write_word(state
, 1074, 0);
799 dib9000_write_word(state
, 1075, 0);
801 /* Set MAC as APB Master. */
802 dib9000_write_word(state
, 1237, 0);
804 /* Reset the RISCs */
806 dib9000_write_word(state
, 1024, 2);
808 dib9000_write_word(state
, 1024, 15);
810 dib9000_write_word(state
, 1040, 2);
813 dib9000_firmware_download(state
, 0, 0x1234, codeA
, lenA
);
815 dib9000_firmware_download(state
, 1, 0x1234, codeB
, lenB
);
819 dib9000_write_word(state
, 1024, 0);
821 dib9000_write_word(state
, 1040, 0);
824 if (dib9000_mbx_host_init(state
, 0) != 0)
827 if (dib9000_mbx_host_init(state
, 1) != 0)
831 state
->platform
.risc
.fw_is_running
= 1;
833 if (dib9000_risc_check_version(state
) != 0)
836 state
->platform
.risc
.memcmd
= 0xff;
840 static u16
dib9000_identify(struct i2c_device
*client
)
844 value
= dib9000_i2c_read16(client
, 896);
845 if (value
!= 0x01b3) {
846 dprintk("wrong Vendor ID (0x%x)", value
);
850 value
= dib9000_i2c_read16(client
, 897);
851 if (value
!= 0x4000 && value
!= 0x4001 && value
!= 0x4002 && value
!= 0x4003 && value
!= 0x4004 && value
!= 0x4005) {
852 dprintk("wrong Device ID (0x%x)", value
);
856 /* protect this driver to be used with 7000PC */
857 if (value
== 0x4000 && dib9000_i2c_read16(client
, 769) == 0x4000) {
858 dprintk("this driver does not work with DiB7000PC");
864 dprintk("found DiB7000MA/PA/MB/PB");
867 dprintk("found DiB7000HC");
870 dprintk("found DiB7000MC");
873 dprintk("found DiB9000A");
876 dprintk("found DiB9000H");
879 dprintk("found DiB9000M");
886 static void dib9000_set_power_mode(struct dib9000_state
*state
, enum dib9000_power_mode mode
)
888 /* by default everything is going to be powered off */
889 u16 reg_903
= 0x3fff, reg_904
= 0xffff, reg_905
= 0xffff, reg_906
;
892 if (state
->revision
== 0x4003 || state
->revision
== 0x4004 || state
->revision
== 0x4005)
897 reg_906
= dib9000_read_word(state
, 906 + offset
) | 0x3; /* keep settings for RISC */
899 /* now, depending on the requested mode, we power on */
901 /* power up everything in the demod */
902 case DIB9000_POWER_ALL
:
909 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
910 case DIB9000_POWER_INTERFACE_ONLY
: /* TODO power up either SDIO or I2C or SRAM */
911 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
914 case DIB9000_POWER_INTERF_ANALOG_AGC
:
915 reg_903
&= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
916 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
917 reg_906
&= ~((1 << 0));
920 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
:
924 reg_906
&= ~((1 << 0));
927 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
:
931 reg_906
&= ~((1 << 0));
934 case DIB9000_POWER_NO
:
938 /* always power down unused parts */
939 if (!state
->platform
.host
.mobile_mode
)
940 reg_904
|= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
942 /* P_sdio_select_clk = 0 on MC and after */
943 if (state
->revision
!= 0x4000)
946 dib9000_write_word(state
, 903 + offset
, reg_903
);
947 dib9000_write_word(state
, 904 + offset
, reg_904
);
948 dib9000_write_word(state
, 905 + offset
, reg_905
);
949 dib9000_write_word(state
, 906 + offset
, reg_906
);
952 static int dib9000_fw_reset(struct dvb_frontend
*fe
)
954 struct dib9000_state
*state
= fe
->demodulator_priv
;
956 dib9000_write_word(state
, 1817, 0x0003);
958 dib9000_write_word(state
, 1227, 1);
959 dib9000_write_word(state
, 1227, 0);
961 switch ((state
->revision
= dib9000_identify(&state
->i2c
))) {
971 /* reset the i2c-master to use the host interface */
972 dibx000_reset_i2c_master(&state
->i2c_master
);
974 dib9000_set_power_mode(state
, DIB9000_POWER_ALL
);
976 /* unforce divstr regardless whether i2c enumeration was done or not */
977 dib9000_write_word(state
, 1794, dib9000_read_word(state
, 1794) & ~(1 << 1));
978 dib9000_write_word(state
, 1796, 0);
979 dib9000_write_word(state
, 1805, 0x805);
981 /* restart all parts */
982 dib9000_write_word(state
, 898, 0xffff);
983 dib9000_write_word(state
, 899, 0xffff);
984 dib9000_write_word(state
, 900, 0x0001);
985 dib9000_write_word(state
, 901, 0xff19);
986 dib9000_write_word(state
, 902, 0x003c);
988 dib9000_write_word(state
, 898, 0);
989 dib9000_write_word(state
, 899, 0);
990 dib9000_write_word(state
, 900, 0);
991 dib9000_write_word(state
, 901, 0);
992 dib9000_write_word(state
, 902, 0);
994 dib9000_write_word(state
, 911, state
->chip
.d9
.cfg
.if_drives
);
996 dib9000_set_power_mode(state
, DIB9000_POWER_INTERFACE_ONLY
);
1001 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
)
1006 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1009 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
1011 mb
[0] = (u16
) address
;
1013 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_R
, mb
, 2, attribute
);
1014 switch (dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
)) {
1017 for (i
= 0; i
< s
; i
++) {
1018 b
[i
* 2] = (mb
[i
+ 1] >> 8) & 0xff;
1019 b
[i
* 2 + 1] = (mb
[i
+ 1]) & 0xff;
1028 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
)
1033 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1036 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1038 mb
[0] = (unsigned short)address
;
1039 for (i
= 0; i
< len
&& i
< 20; i
+= 2)
1040 mb
[1 + (i
/ 2)] = (b
[i
] << 8 | b
[i
+ 1]);
1042 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_W
, mb
, 1 + len
/ 2, attribute
);
1043 return dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
) == 1 ? 0 : -EINVAL
;
1046 static int dib9000_fw_memmbx_sync(struct dib9000_state
*state
, u8 i
)
1050 if (!state
->platform
.risc
.fw_is_running
)
1052 dib9000_risc_mem_write(state
, FE_MM_RW_SYNC
, &i
);
1054 dib9000_risc_mem_read(state
, FE_MM_RW_SYNC
, state
->i2c_read_buffer
, 1);
1055 } while (state
->i2c_read_buffer
[0] && index_loop
--);
1062 static int dib9000_fw_init(struct dib9000_state
*state
)
1064 struct dibGPIOFunction
*f
;
1069 if (dib9000_fw_boot(state
, NULL
, 0, state
->chip
.d9
.cfg
.microcode_B_fe_buffer
, state
->chip
.d9
.cfg
.microcode_B_fe_size
) != 0)
1072 /* initialize the firmware */
1073 for (i
= 0; i
< ARRAY_SIZE(state
->chip
.d9
.cfg
.gpio_function
); i
++) {
1074 f
= &state
->chip
.d9
.cfg
.gpio_function
[i
];
1076 switch (f
->function
) {
1077 case BOARD_GPIO_FUNCTION_COMPONENT_ON
:
1078 b
[0] = (u16
) f
->mask
;
1079 b
[1] = (u16
) f
->direction
;
1080 b
[2] = (u16
) f
->value
;
1082 case BOARD_GPIO_FUNCTION_COMPONENT_OFF
:
1083 b
[3] = (u16
) f
->mask
;
1084 b
[4] = (u16
) f
->direction
;
1085 b
[5] = (u16
) f
->value
;
1090 if (dib9000_mbx_send(state
, OUT_MSG_CONF_GPIO
, b
, 15) != 0)
1094 b
[0] = state
->chip
.d9
.cfg
.subband
.size
; /* type == 0 -> GPIO - PWM not yet supported */
1095 for (i
= 0; i
< state
->chip
.d9
.cfg
.subband
.size
; i
++) {
1096 b
[1 + i
* 4] = state
->chip
.d9
.cfg
.subband
.subband
[i
].f_mhz
;
1097 b
[2 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.mask
;
1098 b
[3 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.direction
;
1099 b
[4 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.value
;
1101 b
[1 + i
* 4] = 0; /* fe_id */
1102 if (dib9000_mbx_send(state
, OUT_MSG_SUBBAND_SEL
, b
, 2 + 4 * i
) != 0)
1105 /* 0 - id, 1 - no_of_frontends */
1106 b
[0] = (0 << 8) | 1;
1107 /* 0 = i2c-address demod, 0 = tuner */
1108 b
[1] = (0 << 8) | (0);
1109 b
[2] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000) >> 16) & 0xffff);
1110 b
[3] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000)) & 0xffff);
1111 b
[4] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
>> 16) & 0xffff);
1112 b
[5] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
) & 0xffff);
1113 b
[6] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
>> 16) & 0xffff);
1114 b
[7] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
) & 0xffff);
1115 b
[29] = state
->chip
.d9
.cfg
.if_drives
;
1116 if (dib9000_mbx_send(state
, OUT_MSG_INIT_DEMOD
, b
, ARRAY_SIZE(b
)) != 0)
1119 if (dib9000_mbx_send(state
, OUT_MSG_FE_FW_DL
, NULL
, 0) != 0)
1122 if (dib9000_mbx_get_message(state
, IN_MSG_FE_FW_DL_DONE
, b
, &size
) < 0)
1125 if (size
> ARRAY_SIZE(b
)) {
1126 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size
,
1127 (int)ARRAY_SIZE(b
));
1131 for (i
= 0; i
< size
; i
+= 2) {
1132 state
->platform
.risc
.fe_mm
[i
/ 2].addr
= b
[i
+ 0];
1133 state
->platform
.risc
.fe_mm
[i
/ 2].size
= b
[i
+ 1];
1139 static void dib9000_fw_set_channel_head(struct dib9000_state
*state
)
1142 u32 freq
= state
->fe
[0]->dtv_property_cache
.frequency
/ 1000;
1143 if (state
->fe_id
% 2)
1146 b
[0] = (u8
) ((freq
>> 0) & 0xff);
1147 b
[1] = (u8
) ((freq
>> 8) & 0xff);
1148 b
[2] = (u8
) ((freq
>> 16) & 0xff);
1149 b
[3] = (u8
) ((freq
>> 24) & 0xff);
1150 b
[4] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 0) & 0xff);
1151 b
[5] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 8) & 0xff);
1152 b
[6] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 16) & 0xff);
1153 b
[7] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 24) & 0xff);
1154 b
[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1155 if (state
->fe
[0]->dtv_property_cache
.delivery_system
== SYS_DVBT
)
1157 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_HEAD
, b
);
1160 static int dib9000_fw_get_channel(struct dvb_frontend
*fe
)
1162 struct dib9000_state
*state
= fe
->demodulator_priv
;
1163 struct dibDVBTChannel
{
1164 s8 spectrum_inversion
;
1178 struct dibDVBTChannel
*ch
;
1181 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
1182 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
1187 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_UNION
,
1188 state
->i2c_read_buffer
, sizeof(struct dibDVBTChannel
));
1189 ch
= (struct dibDVBTChannel
*)state
->i2c_read_buffer
;
1192 switch (ch
->spectrum_inversion
& 0x7) {
1194 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_ON
;
1197 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_OFF
;
1201 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_AUTO
;
1206 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_2K
;
1209 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_4K
;
1212 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_8K
;
1216 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_AUTO
;
1219 switch (ch
->guard
) {
1221 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_32
;
1224 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_16
;
1227 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_8
;
1230 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_4
;
1234 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_AUTO
;
1237 switch (ch
->constellation
) {
1239 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_64
;
1242 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_16
;
1245 state
->fe
[0]->dtv_property_cache
.modulation
= QPSK
;
1249 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_AUTO
;
1254 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_NONE
;
1257 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_1
;
1261 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_AUTO
;
1264 switch (ch
->code_rate_hp
) {
1266 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_1_2
;
1269 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_2_3
;
1272 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_3_4
;
1275 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_5_6
;
1278 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_7_8
;
1282 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_AUTO
;
1285 switch (ch
->code_rate_lp
) {
1287 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_1_2
;
1290 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_2_3
;
1293 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_3_4
;
1296 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_5_6
;
1299 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_7_8
;
1303 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_AUTO
;
1308 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1312 static int dib9000_fw_set_channel_union(struct dvb_frontend
*fe
)
1314 struct dib9000_state
*state
= fe
->demodulator_priv
;
1315 struct dibDVBTChannel
{
1316 s8 spectrum_inversion
;
1330 struct dibDVBTChannel ch
;
1332 switch (state
->fe
[0]->dtv_property_cache
.inversion
) {
1334 ch
.spectrum_inversion
= 1;
1337 ch
.spectrum_inversion
= 0;
1340 case INVERSION_AUTO
:
1341 ch
.spectrum_inversion
= -1;
1344 switch (state
->fe
[0]->dtv_property_cache
.transmission_mode
) {
1345 case TRANSMISSION_MODE_2K
:
1348 case TRANSMISSION_MODE_4K
:
1351 case TRANSMISSION_MODE_8K
:
1355 case TRANSMISSION_MODE_AUTO
:
1359 switch (state
->fe
[0]->dtv_property_cache
.guard_interval
) {
1360 case GUARD_INTERVAL_1_32
:
1363 case GUARD_INTERVAL_1_16
:
1366 case GUARD_INTERVAL_1_8
:
1369 case GUARD_INTERVAL_1_4
:
1373 case GUARD_INTERVAL_AUTO
:
1377 switch (state
->fe
[0]->dtv_property_cache
.modulation
) {
1379 ch
.constellation
= 2;
1382 ch
.constellation
= 1;
1385 ch
.constellation
= 0;
1389 ch
.constellation
= -1;
1392 switch (state
->fe
[0]->dtv_property_cache
.hierarchy
) {
1393 case HIERARCHY_NONE
:
1402 case HIERARCHY_AUTO
:
1407 switch (state
->fe
[0]->dtv_property_cache
.code_rate_HP
) {
1409 ch
.code_rate_hp
= 1;
1412 ch
.code_rate_hp
= 2;
1415 ch
.code_rate_hp
= 3;
1418 ch
.code_rate_hp
= 5;
1421 ch
.code_rate_hp
= 7;
1425 ch
.code_rate_hp
= -1;
1428 switch (state
->fe
[0]->dtv_property_cache
.code_rate_LP
) {
1430 ch
.code_rate_lp
= 1;
1433 ch
.code_rate_lp
= 2;
1436 ch
.code_rate_lp
= 3;
1439 ch
.code_rate_lp
= 5;
1442 ch
.code_rate_lp
= 7;
1446 ch
.code_rate_lp
= -1;
1450 ch
.intlv_native
= 1;
1452 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_UNION
, (u8
*) &ch
);
1457 static int dib9000_fw_tune(struct dvb_frontend
*fe
)
1459 struct dib9000_state
*state
= fe
->demodulator_priv
;
1460 int ret
= 10, search
= state
->channel_status
.status
== CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1463 switch (state
->tune_state
) {
1464 case CT_DEMOD_START
:
1465 dib9000_fw_set_channel_head(state
);
1467 /* write the channel context - a channel is initialized to 0, so it is OK */
1468 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_CONTEXT
, (u8
*) fe_info
);
1469 dib9000_risc_mem_write(state
, FE_MM_W_FE_INFO
, (u8
*) fe_info
);
1472 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_SEARCH
, NULL
, 0);
1474 dib9000_fw_set_channel_union(fe
);
1475 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_TUNE
, NULL
, 0);
1477 state
->tune_state
= CT_DEMOD_STEP_1
;
1479 case CT_DEMOD_STEP_1
:
1481 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_SEARCH_STATE
, state
->i2c_read_buffer
, 1);
1483 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_TUNE_STATE
, state
->i2c_read_buffer
, 1);
1484 i
= (s8
)state
->i2c_read_buffer
[0];
1485 switch (i
) { /* something happened */
1488 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1490 state
->status
= FE_STATUS_DEMOD_SUCCESS
;
1492 state
->tune_state
= CT_DEMOD_STOP
;
1493 state
->status
= FE_STATUS_LOCKED
;
1497 state
->status
= FE_STATUS_TUNE_FAILED
;
1498 state
->tune_state
= CT_DEMOD_STOP
;
1503 ret
= FE_CALLBACK_TIME_NEVER
;
1510 static int dib9000_fw_set_diversity_in(struct dvb_frontend
*fe
, int onoff
)
1512 struct dib9000_state
*state
= fe
->demodulator_priv
;
1513 u16 mode
= (u16
) onoff
;
1514 return dib9000_mbx_send(state
, OUT_MSG_ENABLE_DIVERSITY
, &mode
, 1);
1517 static int dib9000_fw_set_output_mode(struct dvb_frontend
*fe
, int mode
)
1519 struct dib9000_state
*state
= fe
->demodulator_priv
;
1520 u16 outreg
, smo_mode
;
1522 dprintk("setting output mode for demod %p to %d", fe
, mode
);
1525 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1526 outreg
= (1 << 10); /* 0x0400 */
1528 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1529 outreg
= (1 << 10) | (1 << 6); /* 0x0440 */
1531 case OUTMODE_MPEG2_SERIAL
:
1532 outreg
= (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1534 case OUTMODE_DIVERSITY
:
1535 outreg
= (1 << 10) | (4 << 6); /* 0x0500 */
1537 case OUTMODE_MPEG2_FIFO
:
1538 outreg
= (1 << 10) | (5 << 6);
1540 case OUTMODE_HIGH_Z
:
1544 dprintk("Unhandled output_mode passed to be set for demod %p", &state
->fe
[0]);
1548 dib9000_write_word(state
, 1795, outreg
);
1551 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1552 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1553 case OUTMODE_MPEG2_SERIAL
:
1554 case OUTMODE_MPEG2_FIFO
:
1555 smo_mode
= (dib9000_read_word(state
, 295) & 0x0010) | (1 << 1);
1556 if (state
->chip
.d9
.cfg
.output_mpeg2_in_188_bytes
)
1557 smo_mode
|= (1 << 5);
1558 dib9000_write_word(state
, 295, smo_mode
);
1562 outreg
= to_fw_output_mode(mode
);
1563 return dib9000_mbx_send(state
, OUT_MSG_SET_OUTPUT_MODE
, &outreg
, 1);
1566 static int dib9000_tuner_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1568 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1569 u16 i
, len
, t
, index_msg
;
1571 for (index_msg
= 0; index_msg
< num
; index_msg
++) {
1572 if (msg
[index_msg
].flags
& I2C_M_RD
) { /* read */
1573 len
= msg
[index_msg
].len
;
1577 if (dib9000_read_word(state
, 790) != 0)
1578 dprintk("TunerITF: read busy");
1580 dib9000_write_word(state
, 784, (u16
) (msg
[index_msg
].addr
));
1581 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1582 dib9000_write_word(state
, 786, 1); /* start read */
1585 while (dib9000_read_word(state
, 790) != (len
/ 2) && i
)
1589 dprintk("TunerITF: read failed");
1591 for (i
= 0; i
< len
; i
+= 2) {
1592 t
= dib9000_read_word(state
, 785);
1593 msg
[index_msg
].buf
[i
] = (t
>> 8) & 0xff;
1594 msg
[index_msg
].buf
[i
+ 1] = (t
) & 0xff;
1596 if (dib9000_read_word(state
, 790) != 0)
1597 dprintk("TunerITF: read more data than expected");
1600 while (dib9000_read_word(state
, 789) && i
)
1603 dprintk("TunerITF: write busy");
1605 len
= msg
[index_msg
].len
;
1609 for (i
= 0; i
< len
; i
+= 2)
1610 dib9000_write_word(state
, 785, (msg
[index_msg
].buf
[i
] << 8) | msg
[index_msg
].buf
[i
+ 1]);
1611 dib9000_write_word(state
, 784, (u16
) msg
[index_msg
].addr
);
1612 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1613 dib9000_write_word(state
, 786, 0); /* start write */
1616 while (dib9000_read_word(state
, 791) > 0 && i
)
1619 dprintk("TunerITF: write failed");
1625 int dib9000_fw_set_component_bus_speed(struct dvb_frontend
*fe
, u16 speed
)
1627 struct dib9000_state
*state
= fe
->demodulator_priv
;
1629 state
->component_bus_speed
= speed
;
1632 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed
);
1634 static int dib9000_fw_component_bus_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1636 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1637 u8 type
= 0; /* I2C */
1638 u8 port
= DIBX000_I2C_INTERFACE_GPIO_3_4
;
1639 u16 scl
= state
->component_bus_speed
; /* SCL frequency */
1640 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[FE_MM_RW_COMPONENT_ACCESS_BUFFER
];
1645 p
[2] = msg
[0].addr
<< 1;
1647 p
[3] = (u8
) scl
& 0xff; /* scl */
1648 p
[4] = (u8
) (scl
>> 8);
1653 p
[9] = (u8
) (msg
[0].len
);
1654 p
[10] = (u8
) (msg
[0].len
>> 8);
1655 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
)) {
1656 p
[11] = (u8
) (msg
[1].len
);
1657 p
[12] = (u8
) (msg
[1].len
>> 8);
1663 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
1665 dib9000_risc_mem_write(state
, FE_MM_W_COMPONENT_ACCESS
, p
);
1668 dib9000_risc_mem_setup_cmd(state
, m
->addr
, msg
[0].len
, 0);
1669 dib9000_risc_mem_write_chunks(state
, msg
[0].buf
, msg
[0].len
);
1672 /* do the transaction */
1673 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_COMPONENT_ACCESS
) < 0) {
1674 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1678 /* read back any possible result */
1679 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
))
1680 dib9000_risc_mem_read(state
, FE_MM_RW_COMPONENT_ACCESS_BUFFER
, msg
[1].buf
, msg
[1].len
);
1682 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1687 static u32
dib9000_i2c_func(struct i2c_adapter
*adapter
)
1689 return I2C_FUNC_I2C
;
1692 static struct i2c_algorithm dib9000_tuner_algo
= {
1693 .master_xfer
= dib9000_tuner_xfer
,
1694 .functionality
= dib9000_i2c_func
,
1697 static struct i2c_algorithm dib9000_component_bus_algo
= {
1698 .master_xfer
= dib9000_fw_component_bus_xfer
,
1699 .functionality
= dib9000_i2c_func
,
1702 struct i2c_adapter
*dib9000_get_tuner_interface(struct dvb_frontend
*fe
)
1704 struct dib9000_state
*st
= fe
->demodulator_priv
;
1705 return &st
->tuner_adap
;
1707 EXPORT_SYMBOL(dib9000_get_tuner_interface
);
1709 struct i2c_adapter
*dib9000_get_component_bus_interface(struct dvb_frontend
*fe
)
1711 struct dib9000_state
*st
= fe
->demodulator_priv
;
1712 return &st
->component_bus
;
1714 EXPORT_SYMBOL(dib9000_get_component_bus_interface
);
1716 struct i2c_adapter
*dib9000_get_i2c_master(struct dvb_frontend
*fe
, enum dibx000_i2c_interface intf
, int gating
)
1718 struct dib9000_state
*st
= fe
->demodulator_priv
;
1719 return dibx000_get_i2c_adapter(&st
->i2c_master
, intf
, gating
);
1721 EXPORT_SYMBOL(dib9000_get_i2c_master
);
1723 int dib9000_set_i2c_adapter(struct dvb_frontend
*fe
, struct i2c_adapter
*i2c
)
1725 struct dib9000_state
*st
= fe
->demodulator_priv
;
1727 st
->i2c
.i2c_adap
= i2c
;
1730 EXPORT_SYMBOL(dib9000_set_i2c_adapter
);
1732 static int dib9000_cfg_gpio(struct dib9000_state
*st
, u8 num
, u8 dir
, u8 val
)
1734 st
->gpio_dir
= dib9000_read_word(st
, 773);
1735 st
->gpio_dir
&= ~(1 << num
); /* reset the direction bit */
1736 st
->gpio_dir
|= (dir
& 0x1) << num
; /* set the new direction */
1737 dib9000_write_word(st
, 773, st
->gpio_dir
);
1739 st
->gpio_val
= dib9000_read_word(st
, 774);
1740 st
->gpio_val
&= ~(1 << num
); /* reset the direction bit */
1741 st
->gpio_val
|= (val
& 0x01) << num
; /* set the new value */
1742 dib9000_write_word(st
, 774, st
->gpio_val
);
1744 dprintk("gpio dir: %04x: gpio val: %04x", st
->gpio_dir
, st
->gpio_val
);
1749 int dib9000_set_gpio(struct dvb_frontend
*fe
, u8 num
, u8 dir
, u8 val
)
1751 struct dib9000_state
*state
= fe
->demodulator_priv
;
1752 return dib9000_cfg_gpio(state
, num
, dir
, val
);
1754 EXPORT_SYMBOL(dib9000_set_gpio
);
1756 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend
*fe
, u8 onoff
)
1758 struct dib9000_state
*state
= fe
->demodulator_priv
;
1762 if ((state
->pid_ctrl_index
!= -2) && (state
->pid_ctrl_index
< 9)) {
1763 /* postpone the pid filtering cmd */
1764 dprintk("pid filter cmd postpone");
1765 state
->pid_ctrl_index
++;
1766 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER_CTRL
;
1767 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1771 DibAcquireLock(&state
->demod_lock
);
1773 val
= dib9000_read_word(state
, 294 + 1) & 0xffef;
1774 val
|= (onoff
& 0x1) << 4;
1776 dprintk("PID filter enabled %d", onoff
);
1777 ret
= dib9000_write_word(state
, 294 + 1, val
);
1778 DibReleaseLock(&state
->demod_lock
);
1782 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl
);
1784 int dib9000_fw_pid_filter(struct dvb_frontend
*fe
, u8 id
, u16 pid
, u8 onoff
)
1786 struct dib9000_state
*state
= fe
->demodulator_priv
;
1789 if (state
->pid_ctrl_index
!= -2) {
1790 /* postpone the pid filtering cmd */
1791 dprintk("pid filter postpone");
1792 if (state
->pid_ctrl_index
< 9) {
1793 state
->pid_ctrl_index
++;
1794 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER
;
1795 state
->pid_ctrl
[state
->pid_ctrl_index
].id
= id
;
1796 state
->pid_ctrl
[state
->pid_ctrl_index
].pid
= pid
;
1797 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1799 dprintk("can not add any more pid ctrl cmd");
1803 DibAcquireLock(&state
->demod_lock
);
1804 dprintk("Index %x, PID %d, OnOff %d", id
, pid
, onoff
);
1805 ret
= dib9000_write_word(state
, 300 + 1 + id
,
1806 onoff
? (1 << 13) | pid
: 0);
1807 DibReleaseLock(&state
->demod_lock
);
1810 EXPORT_SYMBOL(dib9000_fw_pid_filter
);
1812 int dib9000_firmware_post_pll_init(struct dvb_frontend
*fe
)
1814 struct dib9000_state
*state
= fe
->demodulator_priv
;
1815 return dib9000_fw_init(state
);
1817 EXPORT_SYMBOL(dib9000_firmware_post_pll_init
);
1819 static void dib9000_release(struct dvb_frontend
*demod
)
1821 struct dib9000_state
*st
= demod
->demodulator_priv
;
1824 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (st
->fe
[index_frontend
] != NULL
); index_frontend
++)
1825 dvb_frontend_detach(st
->fe
[index_frontend
]);
1827 DibFreeLock(&state
->platform
.risc
.mbx_if_lock
);
1828 DibFreeLock(&state
->platform
.risc
.mbx_lock
);
1829 DibFreeLock(&state
->platform
.risc
.mem_lock
);
1830 DibFreeLock(&state
->platform
.risc
.mem_mbx_lock
);
1831 DibFreeLock(&state
->demod_lock
);
1832 dibx000_exit_i2c_master(&st
->i2c_master
);
1834 i2c_del_adapter(&st
->tuner_adap
);
1835 i2c_del_adapter(&st
->component_bus
);
1840 static int dib9000_wakeup(struct dvb_frontend
*fe
)
1845 static int dib9000_sleep(struct dvb_frontend
*fe
)
1847 struct dib9000_state
*state
= fe
->demodulator_priv
;
1851 DibAcquireLock(&state
->demod_lock
);
1852 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1853 ret
= state
->fe
[index_frontend
]->ops
.sleep(state
->fe
[index_frontend
]);
1857 ret
= dib9000_mbx_send(state
, OUT_MSG_FE_SLEEP
, NULL
, 0);
1860 DibReleaseLock(&state
->demod_lock
);
1864 static int dib9000_fe_get_tune_settings(struct dvb_frontend
*fe
, struct dvb_frontend_tune_settings
*tune
)
1866 tune
->min_delay_ms
= 1000;
1870 static int dib9000_get_frontend(struct dvb_frontend
*fe
)
1872 struct dib9000_state
*state
= fe
->demodulator_priv
;
1873 u8 index_frontend
, sub_index_frontend
;
1877 if (state
->get_frontend_internal
== 0)
1878 DibAcquireLock(&state
->demod_lock
);
1880 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1881 state
->fe
[index_frontend
]->ops
.read_status(state
->fe
[index_frontend
], &stat
);
1882 if (stat
& FE_HAS_SYNC
) {
1883 dprintk("TPS lock on the slave%i", index_frontend
);
1885 /* synchronize the cache with the other frontends */
1886 state
->fe
[index_frontend
]->ops
.get_frontend(state
->fe
[index_frontend
]);
1887 for (sub_index_frontend
= 0; (sub_index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[sub_index_frontend
] != NULL
);
1888 sub_index_frontend
++) {
1889 if (sub_index_frontend
!= index_frontend
) {
1890 state
->fe
[sub_index_frontend
]->dtv_property_cache
.modulation
=
1891 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
;
1892 state
->fe
[sub_index_frontend
]->dtv_property_cache
.inversion
=
1893 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
;
1894 state
->fe
[sub_index_frontend
]->dtv_property_cache
.transmission_mode
=
1895 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
;
1896 state
->fe
[sub_index_frontend
]->dtv_property_cache
.guard_interval
=
1897 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
;
1898 state
->fe
[sub_index_frontend
]->dtv_property_cache
.hierarchy
=
1899 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
;
1900 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_HP
=
1901 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
;
1902 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_LP
=
1903 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
;
1904 state
->fe
[sub_index_frontend
]->dtv_property_cache
.rolloff
=
1905 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
;
1913 /* get the channel from master chip */
1914 ret
= dib9000_fw_get_channel(fe
);
1918 /* synchronize the cache with the other frontends */
1919 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1920 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
= fe
->dtv_property_cache
.inversion
;
1921 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
= fe
->dtv_property_cache
.transmission_mode
;
1922 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
= fe
->dtv_property_cache
.guard_interval
;
1923 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
= fe
->dtv_property_cache
.modulation
;
1924 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
= fe
->dtv_property_cache
.hierarchy
;
1925 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
= fe
->dtv_property_cache
.code_rate_HP
;
1926 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
= fe
->dtv_property_cache
.code_rate_LP
;
1927 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
= fe
->dtv_property_cache
.rolloff
;
1932 if (state
->get_frontend_internal
== 0)
1933 DibReleaseLock(&state
->demod_lock
);
1937 static int dib9000_set_tune_state(struct dvb_frontend
*fe
, enum frontend_tune_state tune_state
)
1939 struct dib9000_state
*state
= fe
->demodulator_priv
;
1940 state
->tune_state
= tune_state
;
1941 if (tune_state
== CT_DEMOD_START
)
1942 state
->status
= FE_STATUS_TUNE_PENDING
;
1947 static u32
dib9000_get_status(struct dvb_frontend
*fe
)
1949 struct dib9000_state
*state
= fe
->demodulator_priv
;
1950 return state
->status
;
1953 static int dib9000_set_channel_status(struct dvb_frontend
*fe
, struct dvb_frontend_parametersContext
*channel_status
)
1955 struct dib9000_state
*state
= fe
->demodulator_priv
;
1957 memcpy(&state
->channel_status
, channel_status
, sizeof(struct dvb_frontend_parametersContext
));
1961 static int dib9000_set_frontend(struct dvb_frontend
*fe
)
1963 struct dib9000_state
*state
= fe
->demodulator_priv
;
1964 int sleep_time
, sleep_time_slave
;
1965 u32 frontend_status
;
1966 u8 nbr_pending
, exit_condition
, index_frontend
, index_frontend_success
;
1967 struct dvb_frontend_parametersContext channel_status
;
1969 /* check that the correct parameters are set */
1970 if (state
->fe
[0]->dtv_property_cache
.frequency
== 0) {
1971 dprintk("dib9000: must specify frequency ");
1975 if (state
->fe
[0]->dtv_property_cache
.bandwidth_hz
== 0) {
1976 dprintk("dib9000: must specify bandwidth ");
1980 state
->pid_ctrl_index
= -1; /* postpone the pid filtering cmd */
1981 DibAcquireLock(&state
->demod_lock
);
1983 fe
->dtv_property_cache
.delivery_system
= SYS_DVBT
;
1985 /* set the master status */
1986 if (state
->fe
[0]->dtv_property_cache
.transmission_mode
== TRANSMISSION_MODE_AUTO
||
1987 state
->fe
[0]->dtv_property_cache
.guard_interval
== GUARD_INTERVAL_AUTO
||
1988 state
->fe
[0]->dtv_property_cache
.modulation
== QAM_AUTO
||
1989 state
->fe
[0]->dtv_property_cache
.code_rate_HP
== FEC_AUTO
) {
1990 /* no channel specified, autosearch the channel */
1991 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1993 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
1995 /* set mode and status for the different frontends */
1996 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1997 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
], 1);
1999 /* synchronization of the cache */
2000 memcpy(&state
->fe
[index_frontend
]->dtv_property_cache
, &fe
->dtv_property_cache
, sizeof(struct dtv_frontend_properties
));
2002 state
->fe
[index_frontend
]->dtv_property_cache
.delivery_system
= SYS_DVBT
;
2003 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_HIGH_Z
);
2005 dib9000_set_channel_status(state
->fe
[index_frontend
], &state
->channel_status
);
2006 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2010 exit_condition
= 0; /* 0: tune pending; 1: tune failed; 2:tune success */
2011 index_frontend_success
= 0;
2013 sleep_time
= dib9000_fw_tune(state
->fe
[0]);
2014 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2015 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2016 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2017 sleep_time
= sleep_time_slave
;
2018 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2019 sleep_time
= sleep_time_slave
;
2021 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2022 msleep(sleep_time
/ 10);
2028 index_frontend_success
= 0;
2029 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2030 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2031 if (frontend_status
> -FE_STATUS_TUNE_PENDING
) {
2032 exit_condition
= 2; /* tune success */
2033 index_frontend_success
= index_frontend
;
2036 if (frontend_status
== -FE_STATUS_TUNE_PENDING
)
2037 nbr_pending
++; /* some frontends are still tuning */
2039 if ((exit_condition
!= 2) && (nbr_pending
== 0))
2040 exit_condition
= 1; /* if all tune are done and no success, exit: tune failed */
2042 } while (exit_condition
== 0);
2044 /* check the tune result */
2045 if (exit_condition
== 1) { /* tune failed */
2046 dprintk("tune failed");
2047 DibReleaseLock(&state
->demod_lock
);
2048 /* tune failed; put all the pid filtering cmd to junk */
2049 state
->pid_ctrl_index
= -1;
2053 dprintk("tune success on frontend%i", index_frontend_success
);
2055 /* synchronize all the channel cache */
2056 state
->get_frontend_internal
= 1;
2057 dib9000_get_frontend(state
->fe
[0]);
2058 state
->get_frontend_internal
= 0;
2060 /* retune the other frontends with the found channel */
2061 channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
2062 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2063 /* only retune the frontends which was not tuned success */
2064 if (index_frontend
!= index_frontend_success
) {
2065 dib9000_set_channel_status(state
->fe
[index_frontend
], &channel_status
);
2066 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2070 sleep_time
= FE_CALLBACK_TIME_NEVER
;
2071 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2072 if (index_frontend
!= index_frontend_success
) {
2073 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2074 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2075 sleep_time
= sleep_time_slave
;
2076 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2077 sleep_time
= sleep_time_slave
;
2080 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2081 msleep(sleep_time
/ 10);
2086 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2087 if (index_frontend
!= index_frontend_success
) {
2088 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2089 if ((index_frontend
!= index_frontend_success
) && (frontend_status
== -FE_STATUS_TUNE_PENDING
))
2090 nbr_pending
++; /* some frontends are still tuning */
2093 } while (nbr_pending
!= 0);
2095 /* set the output mode */
2096 dib9000_fw_set_output_mode(state
->fe
[0], state
->chip
.d9
.cfg
.output_mode
);
2097 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2098 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_DIVERSITY
);
2100 /* turn off the diversity for the last frontend */
2101 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
- 1], 0);
2103 DibReleaseLock(&state
->demod_lock
);
2104 if (state
->pid_ctrl_index
>= 0) {
2105 u8 index_pid_filter_cmd
;
2106 u8 pid_ctrl_index
= state
->pid_ctrl_index
;
2108 state
->pid_ctrl_index
= -2;
2109 for (index_pid_filter_cmd
= 0;
2110 index_pid_filter_cmd
<= pid_ctrl_index
;
2111 index_pid_filter_cmd
++) {
2112 if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER_CTRL
)
2113 dib9000_fw_pid_filter_ctrl(state
->fe
[0],
2114 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2115 else if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER
)
2116 dib9000_fw_pid_filter(state
->fe
[0],
2117 state
->pid_ctrl
[index_pid_filter_cmd
].id
,
2118 state
->pid_ctrl
[index_pid_filter_cmd
].pid
,
2119 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2122 /* do not postpone any more the pid filtering */
2123 state
->pid_ctrl_index
= -2;
2128 static u16
dib9000_read_lock(struct dvb_frontend
*fe
)
2130 struct dib9000_state
*state
= fe
->demodulator_priv
;
2132 return dib9000_read_word(state
, 535);
2135 static int dib9000_read_status(struct dvb_frontend
*fe
, fe_status_t
* stat
)
2137 struct dib9000_state
*state
= fe
->demodulator_priv
;
2139 u16 lock
= 0, lock_slave
= 0;
2141 DibAcquireLock(&state
->demod_lock
);
2142 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2143 lock_slave
|= dib9000_read_lock(state
->fe
[index_frontend
]);
2145 lock
= dib9000_read_word(state
, 535);
2149 if ((lock
& 0x8000) || (lock_slave
& 0x8000))
2150 *stat
|= FE_HAS_SIGNAL
;
2151 if ((lock
& 0x3000) || (lock_slave
& 0x3000))
2152 *stat
|= FE_HAS_CARRIER
;
2153 if ((lock
& 0x0100) || (lock_slave
& 0x0100))
2154 *stat
|= FE_HAS_VITERBI
;
2155 if (((lock
& 0x0038) == 0x38) || ((lock_slave
& 0x0038) == 0x38))
2156 *stat
|= FE_HAS_SYNC
;
2157 if ((lock
& 0x0008) || (lock_slave
& 0x0008))
2158 *stat
|= FE_HAS_LOCK
;
2160 DibReleaseLock(&state
->demod_lock
);
2165 static int dib9000_read_ber(struct dvb_frontend
*fe
, u32
* ber
)
2167 struct dib9000_state
*state
= fe
->demodulator_priv
;
2171 DibAcquireLock(&state
->demod_lock
);
2172 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2173 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2174 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2178 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
,
2179 state
->i2c_read_buffer
, 16 * 2);
2180 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2182 c
= (u16
*)state
->i2c_read_buffer
;
2184 *ber
= c
[10] << 16 | c
[11];
2187 DibReleaseLock(&state
->demod_lock
);
2191 static int dib9000_read_signal_strength(struct dvb_frontend
*fe
, u16
* strength
)
2193 struct dib9000_state
*state
= fe
->demodulator_priv
;
2195 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2199 DibAcquireLock(&state
->demod_lock
);
2201 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2202 state
->fe
[index_frontend
]->ops
.read_signal_strength(state
->fe
[index_frontend
], &val
);
2203 if (val
> 65535 - *strength
)
2209 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2210 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2214 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2215 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2218 if (val
> 65535 - *strength
)
2224 DibReleaseLock(&state
->demod_lock
);
2228 static u32
dib9000_get_snr(struct dvb_frontend
*fe
)
2230 struct dib9000_state
*state
= fe
->demodulator_priv
;
2231 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2235 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2236 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0)
2238 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2239 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2242 n
= (val
>> 4) & 0xff;
2243 exp
= ((val
& 0xf) << 2);
2245 exp
+= ((val
>> 14) & 0x3);
2246 if ((exp
& 0x20) != 0)
2250 s
= (val
>> 6) & 0xFF;
2252 if ((exp
& 0x20) != 0)
2257 u32 t
= (s
/ n
) << 16;
2258 return t
+ ((s
<< 16) - n
* t
) / n
;
2263 static int dib9000_read_snr(struct dvb_frontend
*fe
, u16
* snr
)
2265 struct dib9000_state
*state
= fe
->demodulator_priv
;
2269 DibAcquireLock(&state
->demod_lock
);
2270 snr_master
= dib9000_get_snr(fe
);
2271 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2272 snr_master
+= dib9000_get_snr(state
->fe
[index_frontend
]);
2274 if ((snr_master
>> 16) != 0) {
2275 snr_master
= 10 * intlog10(snr_master
>> 16);
2276 *snr
= snr_master
/ ((1 << 24) / 10);
2280 DibReleaseLock(&state
->demod_lock
);
2285 static int dib9000_read_unc_blocks(struct dvb_frontend
*fe
, u32
* unc
)
2287 struct dib9000_state
*state
= fe
->demodulator_priv
;
2288 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2291 DibAcquireLock(&state
->demod_lock
);
2292 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2293 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2297 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2298 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2303 DibReleaseLock(&state
->demod_lock
);
2307 int dib9000_i2c_enumeration(struct i2c_adapter
*i2c
, int no_of_demods
, u8 default_addr
, u8 first_addr
)
2311 struct i2c_device client
= {.i2c_adap
= i2c
};
2313 client
.i2c_write_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2314 if (!client
.i2c_write_buffer
) {
2315 dprintk("%s: not enough memory", __func__
);
2318 client
.i2c_read_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2319 if (!client
.i2c_read_buffer
) {
2320 dprintk("%s: not enough memory", __func__
);
2325 client
.i2c_addr
= default_addr
+ 16;
2326 dib9000_i2c_write16(&client
, 1796, 0x0);
2328 for (k
= no_of_demods
- 1; k
>= 0; k
--) {
2329 /* designated i2c address */
2330 new_addr
= first_addr
+ (k
<< 1);
2331 client
.i2c_addr
= default_addr
;
2333 dib9000_i2c_write16(&client
, 1817, 3);
2334 dib9000_i2c_write16(&client
, 1796, 0);
2335 dib9000_i2c_write16(&client
, 1227, 1);
2336 dib9000_i2c_write16(&client
, 1227, 0);
2338 client
.i2c_addr
= new_addr
;
2339 dib9000_i2c_write16(&client
, 1817, 3);
2340 dib9000_i2c_write16(&client
, 1796, 0);
2341 dib9000_i2c_write16(&client
, 1227, 1);
2342 dib9000_i2c_write16(&client
, 1227, 0);
2344 if (dib9000_identify(&client
) == 0) {
2345 client
.i2c_addr
= default_addr
;
2346 if (dib9000_identify(&client
) == 0) {
2347 dprintk("DiB9000 #%d: not identified", k
);
2353 dib9000_i2c_write16(&client
, 1795, (1 << 10) | (4 << 6));
2354 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2) | 2);
2356 dprintk("IC %d initialized (to i2c_address 0x%x)", k
, new_addr
);
2359 for (k
= 0; k
< no_of_demods
; k
++) {
2360 new_addr
= first_addr
| (k
<< 1);
2361 client
.i2c_addr
= new_addr
;
2363 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2));
2364 dib9000_i2c_write16(&client
, 1795, 0);
2368 kfree(client
.i2c_read_buffer
);
2370 kfree(client
.i2c_write_buffer
);
2374 EXPORT_SYMBOL(dib9000_i2c_enumeration
);
2376 int dib9000_set_slave_frontend(struct dvb_frontend
*fe
, struct dvb_frontend
*fe_slave
)
2378 struct dib9000_state
*state
= fe
->demodulator_priv
;
2379 u8 index_frontend
= 1;
2381 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2383 if (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) {
2384 dprintk("set slave fe %p to index %i", fe_slave
, index_frontend
);
2385 state
->fe
[index_frontend
] = fe_slave
;
2389 dprintk("too many slave frontend");
2392 EXPORT_SYMBOL(dib9000_set_slave_frontend
);
2394 int dib9000_remove_slave_frontend(struct dvb_frontend
*fe
)
2396 struct dib9000_state
*state
= fe
->demodulator_priv
;
2397 u8 index_frontend
= 1;
2399 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2401 if (index_frontend
!= 1) {
2402 dprintk("remove slave fe %p (index %i)", state
->fe
[index_frontend
- 1], index_frontend
- 1);
2403 state
->fe
[index_frontend
] = NULL
;
2407 dprintk("no frontend to be removed");
2410 EXPORT_SYMBOL(dib9000_remove_slave_frontend
);
2412 struct dvb_frontend
*dib9000_get_slave_frontend(struct dvb_frontend
*fe
, int slave_index
)
2414 struct dib9000_state
*state
= fe
->demodulator_priv
;
2416 if (slave_index
>= MAX_NUMBER_OF_FRONTENDS
)
2418 return state
->fe
[slave_index
];
2420 EXPORT_SYMBOL(dib9000_get_slave_frontend
);
2422 static struct dvb_frontend_ops dib9000_ops
;
2423 struct dvb_frontend
*dib9000_attach(struct i2c_adapter
*i2c_adap
, u8 i2c_addr
, const struct dib9000_config
*cfg
)
2425 struct dvb_frontend
*fe
;
2426 struct dib9000_state
*st
;
2427 st
= kzalloc(sizeof(struct dib9000_state
), GFP_KERNEL
);
2430 fe
= kzalloc(sizeof(struct dvb_frontend
), GFP_KERNEL
);
2436 memcpy(&st
->chip
.d9
.cfg
, cfg
, sizeof(struct dib9000_config
));
2437 st
->i2c
.i2c_adap
= i2c_adap
;
2438 st
->i2c
.i2c_addr
= i2c_addr
;
2439 st
->i2c
.i2c_write_buffer
= st
->i2c_write_buffer
;
2440 st
->i2c
.i2c_read_buffer
= st
->i2c_read_buffer
;
2442 st
->gpio_dir
= DIB9000_GPIO_DEFAULT_DIRECTIONS
;
2443 st
->gpio_val
= DIB9000_GPIO_DEFAULT_VALUES
;
2444 st
->gpio_pwm_pos
= DIB9000_GPIO_DEFAULT_PWM_POS
;
2446 DibInitLock(&st
->platform
.risc
.mbx_if_lock
);
2447 DibInitLock(&st
->platform
.risc
.mbx_lock
);
2448 DibInitLock(&st
->platform
.risc
.mem_lock
);
2449 DibInitLock(&st
->platform
.risc
.mem_mbx_lock
);
2450 DibInitLock(&st
->demod_lock
);
2451 st
->get_frontend_internal
= 0;
2453 st
->pid_ctrl_index
= -2;
2456 fe
->demodulator_priv
= st
;
2457 memcpy(&st
->fe
[0]->ops
, &dib9000_ops
, sizeof(struct dvb_frontend_ops
));
2459 /* Ensure the output mode remains at the previous default if it's
2460 * not specifically set by the caller.
2462 if ((st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_SERIAL
) && (st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_PAR_GATED_CLK
))
2463 st
->chip
.d9
.cfg
.output_mode
= OUTMODE_MPEG2_FIFO
;
2465 if (dib9000_identify(&st
->i2c
) == 0)
2468 dibx000_init_i2c_master(&st
->i2c_master
, DIB7000MC
, st
->i2c
.i2c_adap
, st
->i2c
.i2c_addr
);
2470 st
->tuner_adap
.dev
.parent
= i2c_adap
->dev
.parent
;
2471 strncpy(st
->tuner_adap
.name
, "DIB9000_FW TUNER ACCESS", sizeof(st
->tuner_adap
.name
));
2472 st
->tuner_adap
.algo
= &dib9000_tuner_algo
;
2473 st
->tuner_adap
.algo_data
= NULL
;
2474 i2c_set_adapdata(&st
->tuner_adap
, st
);
2475 if (i2c_add_adapter(&st
->tuner_adap
) < 0)
2478 st
->component_bus
.dev
.parent
= i2c_adap
->dev
.parent
;
2479 strncpy(st
->component_bus
.name
, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st
->component_bus
.name
));
2480 st
->component_bus
.algo
= &dib9000_component_bus_algo
;
2481 st
->component_bus
.algo_data
= NULL
;
2482 st
->component_bus_speed
= 340;
2483 i2c_set_adapdata(&st
->component_bus
, st
);
2484 if (i2c_add_adapter(&st
->component_bus
) < 0)
2485 goto component_bus_add_error
;
2487 dib9000_fw_reset(fe
);
2491 component_bus_add_error
:
2492 i2c_del_adapter(&st
->tuner_adap
);
2497 EXPORT_SYMBOL(dib9000_attach
);
2499 static struct dvb_frontend_ops dib9000_ops
= {
2500 .delsys
= { SYS_DVBT
},
2502 .name
= "DiBcom 9000",
2503 .frequency_min
= 44250000,
2504 .frequency_max
= 867250000,
2505 .frequency_stepsize
= 62500,
2506 .caps
= FE_CAN_INVERSION_AUTO
|
2507 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
2508 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
2509 FE_CAN_QPSK
| FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
2510 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_RECOVER
| FE_CAN_HIERARCHY_AUTO
,
2513 .release
= dib9000_release
,
2515 .init
= dib9000_wakeup
,
2516 .sleep
= dib9000_sleep
,
2518 .set_frontend
= dib9000_set_frontend
,
2519 .get_tune_settings
= dib9000_fe_get_tune_settings
,
2520 .get_frontend
= dib9000_get_frontend
,
2522 .read_status
= dib9000_read_status
,
2523 .read_ber
= dib9000_read_ber
,
2524 .read_signal_strength
= dib9000_read_signal_strength
,
2525 .read_snr
= dib9000_read_snr
,
2526 .read_ucblocks
= dib9000_read_unc_blocks
,
2529 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2530 MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2531 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2532 MODULE_LICENSE("GPL");