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
;
34 struct dib9000_pid_ctrl
{
35 #define DIB9000_PID_FILTER_CTRL 0
36 #define DIB9000_PID_FILTER 1
43 struct dib9000_state
{
44 struct i2c_device i2c
;
46 struct dibx000_i2c_master i2c_master
;
47 struct i2c_adapter tuner_adap
;
48 struct i2c_adapter component_bus
;
53 enum frontend_tune_state tune_state
;
55 struct dvb_frontend_parametersContext channel_status
;
59 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
61 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
63 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
66 union { /* common for all chips */
72 struct dib9000_fe_memory_map
{
78 struct mutex mbx_if_lock
; /* to protect read/write operations */
79 struct mutex mbx_lock
; /* to protect the whole mailbox handling */
81 struct mutex mem_lock
; /* to protect the memory accesses */
82 struct mutex mem_mbx_lock
; /* to protect the memory-based mailbox */
84 #define MBX_MAX_WORDS (256 - 200 - 2)
85 #define DIB9000_MSG_CACHE_SIZE 2
86 u16 message_cache
[DIB9000_MSG_CACHE_SIZE
][MBX_MAX_WORDS
];
91 union { /* common for all platforms */
93 struct dib9000_config cfg
;
97 struct dvb_frontend
*fe
[MAX_NUMBER_OF_FRONTENDS
];
98 u16 component_bus_speed
;
100 /* for the I2C transfer */
101 struct i2c_msg msg
[2];
102 u8 i2c_write_buffer
[255];
103 u8 i2c_read_buffer
[255];
104 struct mutex demod_lock
;
105 u8 get_frontend_internal
;
106 struct dib9000_pid_ctrl pid_ctrl
[10];
107 s8 pid_ctrl_index
; /* -1: empty list; -2: do not use the list */
110 static const u32 fe_info
[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0
115 enum dib9000_power_mode
{
116 DIB9000_POWER_ALL
= 0,
119 DIB9000_POWER_INTERF_ANALOG_AGC
,
120 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
,
121 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
,
122 DIB9000_POWER_INTERFACE_ONLY
,
125 enum dib9000_out_messages
{
127 OUT_MSG_HOST_BUF_FAIL
,
129 OUT_MSG_BRIDGE_I2C_W
,
130 OUT_MSG_BRIDGE_I2C_R
,
131 OUT_MSG_BRIDGE_APB_W
,
132 OUT_MSG_BRIDGE_APB_R
,
133 OUT_MSG_SCAN_CHANNEL
,
138 OUT_MSG_ENABLE_TIME_SLICE
,
140 OUT_MSG_FE_CHANNEL_SEARCH
,
141 OUT_MSG_FE_CHANNEL_TUNE
,
149 OUT_MSG_ENABLE_DIVERSITY
,
150 OUT_MSG_SET_OUTPUT_MODE
,
151 OUT_MSG_SET_PRIORITARY_CHANNEL
,
156 enum dib9000_in_messages
{
160 IN_MSG_ACK_FREE_ITEM
,
163 IN_MSG_RAWTS_MONITOR
,
164 IN_MSG_END_BRIDGE_I2C_RW
,
165 IN_MSG_END_BRIDGE_APB_RW
,
170 IN_MSG_FE_FW_DL_DONE
,
172 IN_MSG_ACK_CHANGE_SVC
,
176 /* memory_access requests */
177 #define FE_MM_W_CHANNEL 0
178 #define FE_MM_W_FE_INFO 1
179 #define FE_MM_RW_SYNC 2
181 #define FE_SYNC_CHANNEL 1
182 #define FE_SYNC_W_GENERIC_MONIT 2
183 #define FE_SYNC_COMPONENT_ACCESS 3
185 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
186 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
187 #define FE_MM_R_FE_INFO 5
188 #define FE_MM_R_FE_MONITOR 6
190 #define FE_MM_W_CHANNEL_HEAD 7
191 #define FE_MM_W_CHANNEL_UNION 8
192 #define FE_MM_W_CHANNEL_CONTEXT 9
193 #define FE_MM_R_CHANNEL_UNION 10
194 #define FE_MM_R_CHANNEL_CONTEXT 11
195 #define FE_MM_R_CHANNEL_TUNE_STATE 12
197 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
198 #define FE_MM_W_GENERIC_MONITORING 14
199 #define FE_MM_R_GENERIC_MONITORING 15
201 #define FE_MM_W_COMPONENT_ACCESS 16
202 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
203 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
);
204 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
);
206 static u16
to_fw_output_mode(u16 mode
)
211 case OUTMODE_MPEG2_PAR_GATED_CLK
:
213 case OUTMODE_MPEG2_PAR_CONT_CLK
:
215 case OUTMODE_MPEG2_SERIAL
:
217 case OUTMODE_DIVERSITY
:
219 case OUTMODE_MPEG2_FIFO
:
221 case OUTMODE_ANALOG_ADC
:
228 static int dib9000_read16_attr(struct dib9000_state
*state
, u16 reg
, u8
*b
, u32 len
, u16 attribute
)
230 u32 chunk_size
= 126;
234 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024))
235 return dib9000_risc_apb_access_read(state
, reg
, attribute
, NULL
, 0, b
, len
);
237 memset(state
->msg
, 0, 2 * sizeof(struct i2c_msg
));
238 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
239 state
->msg
[0].flags
= 0;
240 state
->msg
[0].buf
= state
->i2c_write_buffer
;
241 state
->msg
[0].len
= 2;
242 state
->msg
[1].addr
= state
->i2c
.i2c_addr
>> 1;
243 state
->msg
[1].flags
= I2C_M_RD
;
244 state
->msg
[1].buf
= b
;
245 state
->msg
[1].len
= len
;
247 state
->i2c_write_buffer
[0] = reg
>> 8;
248 state
->i2c_write_buffer
[1] = reg
& 0xff;
250 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
251 state
->i2c_write_buffer
[0] |= (1 << 5);
252 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
253 state
->i2c_write_buffer
[0] |= (1 << 4);
256 l
= len
< chunk_size
? len
: chunk_size
;
257 state
->msg
[1].len
= l
;
258 state
->msg
[1].buf
= b
;
259 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 2) != 2 ? -EREMOTEIO
: 0;
261 dprintk("i2c read error on %d", reg
);
268 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
270 } while ((ret
== 0) && len
);
275 static u16
dib9000_i2c_read16(struct i2c_device
*i2c
, u16 reg
)
277 struct i2c_msg msg
[2] = {
278 {.addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
279 .buf
= i2c
->i2c_write_buffer
, .len
= 2},
280 {.addr
= i2c
->i2c_addr
>> 1, .flags
= I2C_M_RD
,
281 .buf
= i2c
->i2c_read_buffer
, .len
= 2},
284 i2c
->i2c_write_buffer
[0] = reg
>> 8;
285 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
287 if (i2c_transfer(i2c
->i2c_adap
, msg
, 2) != 2) {
288 dprintk("read register %x error", reg
);
292 return (i2c
->i2c_read_buffer
[0] << 8) | i2c
->i2c_read_buffer
[1];
295 static inline u16
dib9000_read_word(struct dib9000_state
*state
, u16 reg
)
297 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2, 0) != 0)
299 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
302 static inline u16
dib9000_read_word_attr(struct dib9000_state
*state
, u16 reg
, u16 attribute
)
304 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2,
307 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
310 #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)
312 static int dib9000_write16_attr(struct dib9000_state
*state
, u16 reg
, const u8
*buf
, u32 len
, u16 attribute
)
314 u32 chunk_size
= 126;
318 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024)) {
319 if (dib9000_risc_apb_access_write
320 (state
, reg
, DATA_BUS_ACCESS_MODE_16BIT
| DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
| attribute
, buf
, len
) != 0)
325 memset(&state
->msg
[0], 0, sizeof(struct i2c_msg
));
326 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
327 state
->msg
[0].flags
= 0;
328 state
->msg
[0].buf
= state
->i2c_write_buffer
;
329 state
->msg
[0].len
= len
+ 2;
331 state
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
332 state
->i2c_write_buffer
[1] = (reg
) & 0xff;
334 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
335 state
->i2c_write_buffer
[0] |= (1 << 5);
336 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
337 state
->i2c_write_buffer
[0] |= (1 << 4);
340 l
= len
< chunk_size
? len
: chunk_size
;
341 state
->msg
[0].len
= l
+ 2;
342 memcpy(&state
->i2c_write_buffer
[2], buf
, l
);
344 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 1) != 1 ? -EREMOTEIO
: 0;
349 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
351 } while ((ret
== 0) && len
);
356 static int dib9000_i2c_write16(struct i2c_device
*i2c
, u16 reg
, u16 val
)
358 struct i2c_msg msg
= {
359 .addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
360 .buf
= i2c
->i2c_write_buffer
, .len
= 4
363 i2c
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
364 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
365 i2c
->i2c_write_buffer
[2] = (val
>> 8) & 0xff;
366 i2c
->i2c_write_buffer
[3] = val
& 0xff;
368 return i2c_transfer(i2c
->i2c_adap
, &msg
, 1) != 1 ? -EREMOTEIO
: 0;
371 static inline int dib9000_write_word(struct dib9000_state
*state
, u16 reg
, u16 val
)
373 u8 b
[2] = { val
>> 8, val
& 0xff };
374 return dib9000_write16_attr(state
, reg
, b
, 2, 0);
377 static inline int dib9000_write_word_attr(struct dib9000_state
*state
, u16 reg
, u16 val
, u16 attribute
)
379 u8 b
[2] = { val
>> 8, val
& 0xff };
380 return dib9000_write16_attr(state
, reg
, b
, 2, attribute
);
383 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
384 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
385 #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))
387 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
388 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
390 #define MAC_IRQ (1 << 1)
391 #define IRQ_POL_MSK (1 << 4)
393 #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)
394 #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)
396 static void dib9000_risc_mem_setup_cmd(struct dib9000_state
*state
, u32 addr
, u32 len
, u8 reading
)
400 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
406 b
[4] = (u8
) (addr
>> 8);
407 b
[5] = (u8
) (addr
& 0xff);
411 b
[12] = (u8
) (addr
>> 8);
412 b
[13] = (u8
) (addr
& 0xff);
417 b
[8] = (u8
) (addr
>> 8);
418 b
[9] = (u8
) (addr
& 0xff);
420 dib9000_write(state
, 1056, b
, 14);
422 dib9000_write_word(state
, 1056, (1 << 15) | 1);
423 state
->platform
.risc
.memcmd
= -1; /* if it was called directly reset it - to force a future setup-call to set it */
426 static void dib9000_risc_mem_setup(struct dib9000_state
*state
, u8 cmd
)
428 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
& 0x7f];
429 /* decide whether we need to "refresh" the memory controller */
430 if (state
->platform
.risc
.memcmd
== cmd
&& /* same command */
431 !(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 */
433 dib9000_risc_mem_setup_cmd(state
, m
->addr
, m
->size
, cmd
& 0x80);
434 state
->platform
.risc
.memcmd
= cmd
;
437 static int dib9000_risc_mem_read(struct dib9000_state
*state
, u8 cmd
, u8
* b
, u16 len
)
439 if (!state
->platform
.risc
.fw_is_running
)
442 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_lock
) < 0) {
443 dprintk("could not get the lock");
446 dib9000_risc_mem_setup(state
, cmd
| 0x80);
447 dib9000_risc_mem_read_chunks(state
, b
, len
);
448 mutex_unlock(&state
->platform
.risc
.mem_lock
);
452 static int dib9000_risc_mem_write(struct dib9000_state
*state
, u8 cmd
, const u8
* b
)
454 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
];
455 if (!state
->platform
.risc
.fw_is_running
)
458 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_lock
) < 0) {
459 dprintk("could not get the lock");
462 dib9000_risc_mem_setup(state
, cmd
);
463 dib9000_risc_mem_write_chunks(state
, b
, m
->size
);
464 mutex_unlock(&state
->platform
.risc
.mem_lock
);
468 static int dib9000_firmware_download(struct dib9000_state
*state
, u8 risc_id
, u16 key
, const u8
* code
, u32 len
)
477 /* config crtl reg */
478 dib9000_write_word(state
, 1024 + offs
, 0x000f);
479 dib9000_write_word(state
, 1025 + offs
, 0);
480 dib9000_write_word(state
, 1031 + offs
, key
);
482 dprintk("going to download %dB of microcode", len
);
483 if (dib9000_write16_noinc(state
, 1026 + offs
, (u8
*) code
, (u16
) len
) != 0) {
484 dprintk("error while downloading microcode for RISC %c", 'A' + risc_id
);
488 dprintk("Microcode for RISC %c loaded", 'A' + risc_id
);
493 static int dib9000_mbx_host_init(struct dib9000_state
*state
, u8 risc_id
)
505 dib9000_write_word(state
, 1027 + mbox_offs
, 0x8000);
507 /* Read reset status */
509 reset_reg
= dib9000_read_word(state
, 1027 + mbox_offs
);
511 } while ((reset_reg
& 0x8000) && --tries
);
513 if (reset_reg
& 0x8000) {
514 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id
);
517 dprintk("MBX: initialized");
521 #define MAX_MAILBOX_TRY 100
522 static int dib9000_mbx_send_attr(struct dib9000_state
*state
, u8 id
, u16
* data
, u8 len
, u16 attr
)
530 if (!state
->platform
.risc
.fw_is_running
)
533 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_if_lock
) < 0) {
534 dprintk("could not get the lock");
537 tmp
= MAX_MAILBOX_TRY
;
539 size
= dib9000_read_word_attr(state
, 1043, attr
) & 0xff;
540 if ((size
+ len
+ 1) > MBX_MAX_WORDS
&& --tmp
) {
541 dprintk("MBX: RISC mbx full, retrying");
547 /*dprintk( "MBX: size: %d", size); */
554 dprintk("--> %02x %d ", id
, len
+ 1);
555 for (i
= 0; i
< len
; i
++)
556 dprintk("%04x ", data
[i
]);
560 /* byte-order conversion - works on big (where it is not necessary) or little endian */
562 for (i
= 0; i
< len
; i
++) {
571 if (dib9000_write16_noinc_attr(state
, 1045, b
, 2, attr
) != 0 || dib9000_write16_noinc_attr(state
, 1045, (u8
*) data
, len
* 2, attr
) != 0) {
576 /* update register nb_mes_in_RX */
577 ret
= (u8
) dib9000_write_word_attr(state
, 1043, 1 << 14, attr
);
580 mutex_unlock(&state
->platform
.risc
.mbx_if_lock
);
585 static u8
dib9000_mbx_read(struct dib9000_state
*state
, u16
* data
, u8 risc_id
, u16 attr
)
595 if (!state
->platform
.risc
.fw_is_running
)
598 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_if_lock
) < 0) {
599 dprintk("could not get the lock");
607 /* Length and type in the first word */
608 *data
= dib9000_read_word_attr(state
, 1029 + mc_base
, attr
);
611 if (size
<= MBX_MAX_WORDS
) {
613 size
--; /* Initial word already read */
615 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, size
* 2, attr
);
617 /* to word conversion */
618 for (i
= 0; i
< size
; i
++) {
620 *data
= (tmp
>> 8) | (tmp
<< 8);
626 for (i
= 0; i
< size
+ 1; i
++)
627 dprintk("%04x ", d
[i
]);
631 dprintk("MBX: message is too big for message cache (%d), flushing message", size
);
632 size
--; /* Initial word already read */
634 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, 2, attr
);
636 /* Update register nb_mes_in_TX */
637 dib9000_write_word_attr(state
, 1028 + mc_base
, 1 << 14, attr
);
639 mutex_unlock(&state
->platform
.risc
.mbx_if_lock
);
644 static int dib9000_risc_debug_buf(struct dib9000_state
*state
, u16
* data
, u8 size
)
646 u32 ts
= data
[1] << 16 | data
[0];
647 char *b
= (char *)&data
[2];
649 b
[2 * (size
- 2) - 1] = '\0'; /* Bullet proof the buffer */
654 dprintk("RISC%d: %d.%04d %s", state
->fe_id
, ts
/ 10000, ts
% 10000, *b
? b
: "<empty>");
658 static int dib9000_mbx_fetch_to_cache(struct dib9000_state
*state
, u16 attr
)
663 /* find a free slot */
664 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
665 block
= state
->platform
.risc
.message_cache
[i
];
667 size
= dib9000_mbx_read(state
, block
, 1, attr
);
669 /* dprintk( "MBX: fetched %04x message to cache", *block); */
671 switch (*block
>> 8) {
672 case IN_MSG_DEBUG_BUF
:
673 dib9000_risc_debug_buf(state
, block
+ 1, size
); /* debug-messages are going to be printed right away */
674 *block
= 0; /* free the block */
677 case IN_MSG_DATA
: /* FE-TRACE */
678 dib9000_risc_data_process(state
, block
+ 1, size
);
689 dprintk("MBX: no free cache-slot found for new message...");
693 static u8
dib9000_mbx_count(struct dib9000_state
*state
, u8 risc_id
, u16 attr
)
696 return (u8
) (dib9000_read_word_attr(state
, 1028, attr
) >> 10) & 0x1f; /* 5 bit field */
698 return (u8
) (dib9000_read_word_attr(state
, 1044, attr
) >> 8) & 0x7f; /* 7 bit field */
701 static int dib9000_mbx_process(struct dib9000_state
*state
, u16 attr
)
705 if (!state
->platform
.risc
.fw_is_running
)
708 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_lock
) < 0) {
709 dprintk("could not get the lock");
713 if (dib9000_mbx_count(state
, 1, attr
)) /* 1=RiscB */
714 ret
= dib9000_mbx_fetch_to_cache(state
, attr
);
716 dib9000_read_word_attr(state
, 1229, attr
); /* Clear the IRQ */
718 /* dprintk( "cleared IRQ: %x", tmp); */
719 mutex_unlock(&state
->platform
.risc
.mbx_lock
);
724 static int dib9000_mbx_get_message_attr(struct dib9000_state
*state
, u16 id
, u16
* msg
, u8
* size
, u16 attr
)
732 /* dib9000_mbx_get_from_cache(); */
733 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
734 block
= state
->platform
.risc
.message_cache
[i
];
735 if ((*block
>> 8) == id
) {
736 *size
= (*block
& 0xff) - 1;
737 memcpy(msg
, block
+ 1, (*size
) * 2);
738 *block
= 0; /* free the block */
739 i
= 0; /* signal that we found a message */
747 if (dib9000_mbx_process(state
, attr
) == -1) /* try to fetch one message - if any */
753 dprintk("waiting for message %d timed out", id
);
760 static int dib9000_risc_check_version(struct dib9000_state
*state
)
766 if (dib9000_mbx_send(state
, OUT_MSG_REQ_VERSION
, &fw_version
, 1) != 0)
769 if (dib9000_mbx_get_message(state
, IN_MSG_VERSION
, (u16
*) r
, &size
) < 0)
772 fw_version
= (r
[0] << 8) | r
[1];
773 dprintk("RISC: ver: %d.%02d (IC: %d)", fw_version
>> 10, fw_version
& 0x3ff, (r
[2] << 8) | r
[3]);
775 if ((fw_version
>> 10) != 7)
778 switch (fw_version
& 0x3ff) {
787 dprintk("RISC: invalid firmware version");
791 dprintk("RISC: valid firmware version");
795 static int dib9000_fw_boot(struct dib9000_state
*state
, const u8
* codeA
, u32 lenA
, const u8
* codeB
, u32 lenB
)
797 /* Reconfig pool mac ram */
798 dib9000_write_word(state
, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
799 dib9000_write_word(state
, 1226, 0x05);
801 /* Toggles IP crypto to Host APB interface. */
802 dib9000_write_word(state
, 1542, 1);
804 /* Set jump and no jump in the dma box */
805 dib9000_write_word(state
, 1074, 0);
806 dib9000_write_word(state
, 1075, 0);
808 /* Set MAC as APB Master. */
809 dib9000_write_word(state
, 1237, 0);
811 /* Reset the RISCs */
813 dib9000_write_word(state
, 1024, 2);
815 dib9000_write_word(state
, 1024, 15);
817 dib9000_write_word(state
, 1040, 2);
820 dib9000_firmware_download(state
, 0, 0x1234, codeA
, lenA
);
822 dib9000_firmware_download(state
, 1, 0x1234, codeB
, lenB
);
826 dib9000_write_word(state
, 1024, 0);
828 dib9000_write_word(state
, 1040, 0);
831 if (dib9000_mbx_host_init(state
, 0) != 0)
834 if (dib9000_mbx_host_init(state
, 1) != 0)
838 state
->platform
.risc
.fw_is_running
= 1;
840 if (dib9000_risc_check_version(state
) != 0)
843 state
->platform
.risc
.memcmd
= 0xff;
847 static u16
dib9000_identify(struct i2c_device
*client
)
851 value
= dib9000_i2c_read16(client
, 896);
852 if (value
!= 0x01b3) {
853 dprintk("wrong Vendor ID (0x%x)", value
);
857 value
= dib9000_i2c_read16(client
, 897);
858 if (value
!= 0x4000 && value
!= 0x4001 && value
!= 0x4002 && value
!= 0x4003 && value
!= 0x4004 && value
!= 0x4005) {
859 dprintk("wrong Device ID (0x%x)", value
);
863 /* protect this driver to be used with 7000PC */
864 if (value
== 0x4000 && dib9000_i2c_read16(client
, 769) == 0x4000) {
865 dprintk("this driver does not work with DiB7000PC");
871 dprintk("found DiB7000MA/PA/MB/PB");
874 dprintk("found DiB7000HC");
877 dprintk("found DiB7000MC");
880 dprintk("found DiB9000A");
883 dprintk("found DiB9000H");
886 dprintk("found DiB9000M");
893 static void dib9000_set_power_mode(struct dib9000_state
*state
, enum dib9000_power_mode mode
)
895 /* by default everything is going to be powered off */
896 u16 reg_903
= 0x3fff, reg_904
= 0xffff, reg_905
= 0xffff, reg_906
;
899 if (state
->revision
== 0x4003 || state
->revision
== 0x4004 || state
->revision
== 0x4005)
904 reg_906
= dib9000_read_word(state
, 906 + offset
) | 0x3; /* keep settings for RISC */
906 /* now, depending on the requested mode, we power on */
908 /* power up everything in the demod */
909 case DIB9000_POWER_ALL
:
916 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
917 case DIB9000_POWER_INTERFACE_ONLY
: /* TODO power up either SDIO or I2C or SRAM */
918 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
921 case DIB9000_POWER_INTERF_ANALOG_AGC
:
922 reg_903
&= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
923 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
924 reg_906
&= ~((1 << 0));
927 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
:
931 reg_906
&= ~((1 << 0));
934 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
:
938 reg_906
&= ~((1 << 0));
941 case DIB9000_POWER_NO
:
945 /* always power down unused parts */
946 if (!state
->platform
.host
.mobile_mode
)
947 reg_904
|= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
949 /* P_sdio_select_clk = 0 on MC and after */
950 if (state
->revision
!= 0x4000)
953 dib9000_write_word(state
, 903 + offset
, reg_903
);
954 dib9000_write_word(state
, 904 + offset
, reg_904
);
955 dib9000_write_word(state
, 905 + offset
, reg_905
);
956 dib9000_write_word(state
, 906 + offset
, reg_906
);
959 static int dib9000_fw_reset(struct dvb_frontend
*fe
)
961 struct dib9000_state
*state
= fe
->demodulator_priv
;
963 dib9000_write_word(state
, 1817, 0x0003);
965 dib9000_write_word(state
, 1227, 1);
966 dib9000_write_word(state
, 1227, 0);
968 switch ((state
->revision
= dib9000_identify(&state
->i2c
))) {
978 /* reset the i2c-master to use the host interface */
979 dibx000_reset_i2c_master(&state
->i2c_master
);
981 dib9000_set_power_mode(state
, DIB9000_POWER_ALL
);
983 /* unforce divstr regardless whether i2c enumeration was done or not */
984 dib9000_write_word(state
, 1794, dib9000_read_word(state
, 1794) & ~(1 << 1));
985 dib9000_write_word(state
, 1796, 0);
986 dib9000_write_word(state
, 1805, 0x805);
988 /* restart all parts */
989 dib9000_write_word(state
, 898, 0xffff);
990 dib9000_write_word(state
, 899, 0xffff);
991 dib9000_write_word(state
, 900, 0x0001);
992 dib9000_write_word(state
, 901, 0xff19);
993 dib9000_write_word(state
, 902, 0x003c);
995 dib9000_write_word(state
, 898, 0);
996 dib9000_write_word(state
, 899, 0);
997 dib9000_write_word(state
, 900, 0);
998 dib9000_write_word(state
, 901, 0);
999 dib9000_write_word(state
, 902, 0);
1001 dib9000_write_word(state
, 911, state
->chip
.d9
.cfg
.if_drives
);
1003 dib9000_set_power_mode(state
, DIB9000_POWER_INTERFACE_ONLY
);
1008 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
)
1013 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1016 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
1018 mb
[0] = (u16
) address
;
1020 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_R
, mb
, 2, attribute
);
1021 switch (dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
)) {
1024 for (i
= 0; i
< s
; i
++) {
1025 b
[i
* 2] = (mb
[i
+ 1] >> 8) & 0xff;
1026 b
[i
* 2 + 1] = (mb
[i
+ 1]) & 0xff;
1035 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
)
1040 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1046 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1048 mb
[0] = (u16
)address
;
1049 for (i
= 0; i
+ 1 < len
; i
+= 2)
1050 mb
[1 + i
/ 2] = b
[i
] << 8 | b
[i
+ 1];
1052 mb
[1 + len
/ 2] = b
[len
- 1] << 8;
1054 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_W
, mb
, (3 + len
) / 2, attribute
);
1055 return dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
) == 1 ? 0 : -EINVAL
;
1058 static int dib9000_fw_memmbx_sync(struct dib9000_state
*state
, u8 i
)
1062 if (!state
->platform
.risc
.fw_is_running
)
1064 dib9000_risc_mem_write(state
, FE_MM_RW_SYNC
, &i
);
1066 dib9000_risc_mem_read(state
, FE_MM_RW_SYNC
, state
->i2c_read_buffer
, 1);
1067 } while (state
->i2c_read_buffer
[0] && index_loop
--);
1074 static int dib9000_fw_init(struct dib9000_state
*state
)
1076 struct dibGPIOFunction
*f
;
1081 if (dib9000_fw_boot(state
, NULL
, 0, state
->chip
.d9
.cfg
.microcode_B_fe_buffer
, state
->chip
.d9
.cfg
.microcode_B_fe_size
) != 0)
1084 /* initialize the firmware */
1085 for (i
= 0; i
< ARRAY_SIZE(state
->chip
.d9
.cfg
.gpio_function
); i
++) {
1086 f
= &state
->chip
.d9
.cfg
.gpio_function
[i
];
1088 switch (f
->function
) {
1089 case BOARD_GPIO_FUNCTION_COMPONENT_ON
:
1090 b
[0] = (u16
) f
->mask
;
1091 b
[1] = (u16
) f
->direction
;
1092 b
[2] = (u16
) f
->value
;
1094 case BOARD_GPIO_FUNCTION_COMPONENT_OFF
:
1095 b
[3] = (u16
) f
->mask
;
1096 b
[4] = (u16
) f
->direction
;
1097 b
[5] = (u16
) f
->value
;
1102 if (dib9000_mbx_send(state
, OUT_MSG_CONF_GPIO
, b
, 15) != 0)
1106 b
[0] = state
->chip
.d9
.cfg
.subband
.size
; /* type == 0 -> GPIO - PWM not yet supported */
1107 for (i
= 0; i
< state
->chip
.d9
.cfg
.subband
.size
; i
++) {
1108 b
[1 + i
* 4] = state
->chip
.d9
.cfg
.subband
.subband
[i
].f_mhz
;
1109 b
[2 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.mask
;
1110 b
[3 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.direction
;
1111 b
[4 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.value
;
1113 b
[1 + i
* 4] = 0; /* fe_id */
1114 if (dib9000_mbx_send(state
, OUT_MSG_SUBBAND_SEL
, b
, 2 + 4 * i
) != 0)
1117 /* 0 - id, 1 - no_of_frontends */
1118 b
[0] = (0 << 8) | 1;
1119 /* 0 = i2c-address demod, 0 = tuner */
1120 b
[1] = (0 << 8) | (0);
1121 b
[2] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000) >> 16) & 0xffff);
1122 b
[3] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000)) & 0xffff);
1123 b
[4] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
>> 16) & 0xffff);
1124 b
[5] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
) & 0xffff);
1125 b
[6] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
>> 16) & 0xffff);
1126 b
[7] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
) & 0xffff);
1127 b
[29] = state
->chip
.d9
.cfg
.if_drives
;
1128 if (dib9000_mbx_send(state
, OUT_MSG_INIT_DEMOD
, b
, ARRAY_SIZE(b
)) != 0)
1131 if (dib9000_mbx_send(state
, OUT_MSG_FE_FW_DL
, NULL
, 0) != 0)
1134 if (dib9000_mbx_get_message(state
, IN_MSG_FE_FW_DL_DONE
, b
, &size
) < 0)
1137 if (size
> ARRAY_SIZE(b
)) {
1138 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size
,
1139 (int)ARRAY_SIZE(b
));
1143 for (i
= 0; i
< size
; i
+= 2) {
1144 state
->platform
.risc
.fe_mm
[i
/ 2].addr
= b
[i
+ 0];
1145 state
->platform
.risc
.fe_mm
[i
/ 2].size
= b
[i
+ 1];
1151 static void dib9000_fw_set_channel_head(struct dib9000_state
*state
)
1154 u32 freq
= state
->fe
[0]->dtv_property_cache
.frequency
/ 1000;
1155 if (state
->fe_id
% 2)
1158 b
[0] = (u8
) ((freq
>> 0) & 0xff);
1159 b
[1] = (u8
) ((freq
>> 8) & 0xff);
1160 b
[2] = (u8
) ((freq
>> 16) & 0xff);
1161 b
[3] = (u8
) ((freq
>> 24) & 0xff);
1162 b
[4] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 0) & 0xff);
1163 b
[5] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 8) & 0xff);
1164 b
[6] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 16) & 0xff);
1165 b
[7] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 24) & 0xff);
1166 b
[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1167 if (state
->fe
[0]->dtv_property_cache
.delivery_system
== SYS_DVBT
)
1169 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_HEAD
, b
);
1172 static int dib9000_fw_get_channel(struct dvb_frontend
*fe
)
1174 struct dib9000_state
*state
= fe
->demodulator_priv
;
1175 struct dibDVBTChannel
{
1176 s8 spectrum_inversion
;
1190 struct dibDVBTChannel
*ch
;
1193 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
1194 dprintk("could not get the lock");
1197 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
1202 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_UNION
,
1203 state
->i2c_read_buffer
, sizeof(struct dibDVBTChannel
));
1204 ch
= (struct dibDVBTChannel
*)state
->i2c_read_buffer
;
1207 switch (ch
->spectrum_inversion
& 0x7) {
1209 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_ON
;
1212 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_OFF
;
1216 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_AUTO
;
1221 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_2K
;
1224 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_4K
;
1227 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_8K
;
1231 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_AUTO
;
1234 switch (ch
->guard
) {
1236 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_32
;
1239 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_16
;
1242 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_8
;
1245 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_4
;
1249 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_AUTO
;
1252 switch (ch
->constellation
) {
1254 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_64
;
1257 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_16
;
1260 state
->fe
[0]->dtv_property_cache
.modulation
= QPSK
;
1264 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_AUTO
;
1269 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_NONE
;
1272 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_1
;
1276 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_AUTO
;
1279 switch (ch
->code_rate_hp
) {
1281 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_1_2
;
1284 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_2_3
;
1287 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_3_4
;
1290 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_5_6
;
1293 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_7_8
;
1297 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_AUTO
;
1300 switch (ch
->code_rate_lp
) {
1302 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_1_2
;
1305 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_2_3
;
1308 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_3_4
;
1311 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_5_6
;
1314 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_7_8
;
1318 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_AUTO
;
1323 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1327 static int dib9000_fw_set_channel_union(struct dvb_frontend
*fe
)
1329 struct dib9000_state
*state
= fe
->demodulator_priv
;
1330 struct dibDVBTChannel
{
1331 s8 spectrum_inversion
;
1345 struct dibDVBTChannel ch
;
1347 switch (state
->fe
[0]->dtv_property_cache
.inversion
) {
1349 ch
.spectrum_inversion
= 1;
1352 ch
.spectrum_inversion
= 0;
1355 case INVERSION_AUTO
:
1356 ch
.spectrum_inversion
= -1;
1359 switch (state
->fe
[0]->dtv_property_cache
.transmission_mode
) {
1360 case TRANSMISSION_MODE_2K
:
1363 case TRANSMISSION_MODE_4K
:
1366 case TRANSMISSION_MODE_8K
:
1370 case TRANSMISSION_MODE_AUTO
:
1374 switch (state
->fe
[0]->dtv_property_cache
.guard_interval
) {
1375 case GUARD_INTERVAL_1_32
:
1378 case GUARD_INTERVAL_1_16
:
1381 case GUARD_INTERVAL_1_8
:
1384 case GUARD_INTERVAL_1_4
:
1388 case GUARD_INTERVAL_AUTO
:
1392 switch (state
->fe
[0]->dtv_property_cache
.modulation
) {
1394 ch
.constellation
= 2;
1397 ch
.constellation
= 1;
1400 ch
.constellation
= 0;
1404 ch
.constellation
= -1;
1407 switch (state
->fe
[0]->dtv_property_cache
.hierarchy
) {
1408 case HIERARCHY_NONE
:
1417 case HIERARCHY_AUTO
:
1422 switch (state
->fe
[0]->dtv_property_cache
.code_rate_HP
) {
1424 ch
.code_rate_hp
= 1;
1427 ch
.code_rate_hp
= 2;
1430 ch
.code_rate_hp
= 3;
1433 ch
.code_rate_hp
= 5;
1436 ch
.code_rate_hp
= 7;
1440 ch
.code_rate_hp
= -1;
1443 switch (state
->fe
[0]->dtv_property_cache
.code_rate_LP
) {
1445 ch
.code_rate_lp
= 1;
1448 ch
.code_rate_lp
= 2;
1451 ch
.code_rate_lp
= 3;
1454 ch
.code_rate_lp
= 5;
1457 ch
.code_rate_lp
= 7;
1461 ch
.code_rate_lp
= -1;
1465 ch
.intlv_native
= 1;
1467 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_UNION
, (u8
*) &ch
);
1472 static int dib9000_fw_tune(struct dvb_frontend
*fe
)
1474 struct dib9000_state
*state
= fe
->demodulator_priv
;
1475 int ret
= 10, search
= state
->channel_status
.status
== CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1478 switch (state
->tune_state
) {
1479 case CT_DEMOD_START
:
1480 dib9000_fw_set_channel_head(state
);
1482 /* write the channel context - a channel is initialized to 0, so it is OK */
1483 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_CONTEXT
, (u8
*) fe_info
);
1484 dib9000_risc_mem_write(state
, FE_MM_W_FE_INFO
, (u8
*) fe_info
);
1487 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_SEARCH
, NULL
, 0);
1489 dib9000_fw_set_channel_union(fe
);
1490 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_TUNE
, NULL
, 0);
1492 state
->tune_state
= CT_DEMOD_STEP_1
;
1494 case CT_DEMOD_STEP_1
:
1496 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_SEARCH_STATE
, state
->i2c_read_buffer
, 1);
1498 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_TUNE_STATE
, state
->i2c_read_buffer
, 1);
1499 i
= (s8
)state
->i2c_read_buffer
[0];
1500 switch (i
) { /* something happened */
1503 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1505 state
->status
= FE_STATUS_DEMOD_SUCCESS
;
1507 state
->tune_state
= CT_DEMOD_STOP
;
1508 state
->status
= FE_STATUS_LOCKED
;
1512 state
->status
= FE_STATUS_TUNE_FAILED
;
1513 state
->tune_state
= CT_DEMOD_STOP
;
1518 ret
= FE_CALLBACK_TIME_NEVER
;
1525 static int dib9000_fw_set_diversity_in(struct dvb_frontend
*fe
, int onoff
)
1527 struct dib9000_state
*state
= fe
->demodulator_priv
;
1528 u16 mode
= (u16
) onoff
;
1529 return dib9000_mbx_send(state
, OUT_MSG_ENABLE_DIVERSITY
, &mode
, 1);
1532 static int dib9000_fw_set_output_mode(struct dvb_frontend
*fe
, int mode
)
1534 struct dib9000_state
*state
= fe
->demodulator_priv
;
1535 u16 outreg
, smo_mode
;
1537 dprintk("setting output mode for demod %p to %d", fe
, mode
);
1540 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1541 outreg
= (1 << 10); /* 0x0400 */
1543 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1544 outreg
= (1 << 10) | (1 << 6); /* 0x0440 */
1546 case OUTMODE_MPEG2_SERIAL
:
1547 outreg
= (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1549 case OUTMODE_DIVERSITY
:
1550 outreg
= (1 << 10) | (4 << 6); /* 0x0500 */
1552 case OUTMODE_MPEG2_FIFO
:
1553 outreg
= (1 << 10) | (5 << 6);
1555 case OUTMODE_HIGH_Z
:
1559 dprintk("Unhandled output_mode passed to be set for demod %p", &state
->fe
[0]);
1563 dib9000_write_word(state
, 1795, outreg
);
1566 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1567 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1568 case OUTMODE_MPEG2_SERIAL
:
1569 case OUTMODE_MPEG2_FIFO
:
1570 smo_mode
= (dib9000_read_word(state
, 295) & 0x0010) | (1 << 1);
1571 if (state
->chip
.d9
.cfg
.output_mpeg2_in_188_bytes
)
1572 smo_mode
|= (1 << 5);
1573 dib9000_write_word(state
, 295, smo_mode
);
1577 outreg
= to_fw_output_mode(mode
);
1578 return dib9000_mbx_send(state
, OUT_MSG_SET_OUTPUT_MODE
, &outreg
, 1);
1581 static int dib9000_tuner_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1583 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1584 u16 i
, len
, t
, index_msg
;
1586 for (index_msg
= 0; index_msg
< num
; index_msg
++) {
1587 if (msg
[index_msg
].flags
& I2C_M_RD
) { /* read */
1588 len
= msg
[index_msg
].len
;
1592 if (dib9000_read_word(state
, 790) != 0)
1593 dprintk("TunerITF: read busy");
1595 dib9000_write_word(state
, 784, (u16
) (msg
[index_msg
].addr
));
1596 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1597 dib9000_write_word(state
, 786, 1); /* start read */
1600 while (dib9000_read_word(state
, 790) != (len
/ 2) && i
)
1604 dprintk("TunerITF: read failed");
1606 for (i
= 0; i
< len
; i
+= 2) {
1607 t
= dib9000_read_word(state
, 785);
1608 msg
[index_msg
].buf
[i
] = (t
>> 8) & 0xff;
1609 msg
[index_msg
].buf
[i
+ 1] = (t
) & 0xff;
1611 if (dib9000_read_word(state
, 790) != 0)
1612 dprintk("TunerITF: read more data than expected");
1615 while (dib9000_read_word(state
, 789) && i
)
1618 dprintk("TunerITF: write busy");
1620 len
= msg
[index_msg
].len
;
1624 for (i
= 0; i
< len
; i
+= 2)
1625 dib9000_write_word(state
, 785, (msg
[index_msg
].buf
[i
] << 8) | msg
[index_msg
].buf
[i
+ 1]);
1626 dib9000_write_word(state
, 784, (u16
) msg
[index_msg
].addr
);
1627 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1628 dib9000_write_word(state
, 786, 0); /* start write */
1631 while (dib9000_read_word(state
, 791) > 0 && i
)
1634 dprintk("TunerITF: write failed");
1640 int dib9000_fw_set_component_bus_speed(struct dvb_frontend
*fe
, u16 speed
)
1642 struct dib9000_state
*state
= fe
->demodulator_priv
;
1644 state
->component_bus_speed
= speed
;
1647 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed
);
1649 static int dib9000_fw_component_bus_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1651 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1652 u8 type
= 0; /* I2C */
1653 u8 port
= DIBX000_I2C_INTERFACE_GPIO_3_4
;
1654 u16 scl
= state
->component_bus_speed
; /* SCL frequency */
1655 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[FE_MM_RW_COMPONENT_ACCESS_BUFFER
];
1660 p
[2] = msg
[0].addr
<< 1;
1662 p
[3] = (u8
) scl
& 0xff; /* scl */
1663 p
[4] = (u8
) (scl
>> 8);
1668 p
[9] = (u8
) (msg
[0].len
);
1669 p
[10] = (u8
) (msg
[0].len
>> 8);
1670 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
)) {
1671 p
[11] = (u8
) (msg
[1].len
);
1672 p
[12] = (u8
) (msg
[1].len
>> 8);
1678 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
1679 dprintk("could not get the lock");
1683 dib9000_risc_mem_write(state
, FE_MM_W_COMPONENT_ACCESS
, p
);
1686 dib9000_risc_mem_setup_cmd(state
, m
->addr
, msg
[0].len
, 0);
1687 dib9000_risc_mem_write_chunks(state
, msg
[0].buf
, msg
[0].len
);
1690 /* do the transaction */
1691 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_COMPONENT_ACCESS
) < 0) {
1692 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1696 /* read back any possible result */
1697 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
))
1698 dib9000_risc_mem_read(state
, FE_MM_RW_COMPONENT_ACCESS_BUFFER
, msg
[1].buf
, msg
[1].len
);
1700 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1705 static u32
dib9000_i2c_func(struct i2c_adapter
*adapter
)
1707 return I2C_FUNC_I2C
;
1710 static struct i2c_algorithm dib9000_tuner_algo
= {
1711 .master_xfer
= dib9000_tuner_xfer
,
1712 .functionality
= dib9000_i2c_func
,
1715 static struct i2c_algorithm dib9000_component_bus_algo
= {
1716 .master_xfer
= dib9000_fw_component_bus_xfer
,
1717 .functionality
= dib9000_i2c_func
,
1720 struct i2c_adapter
*dib9000_get_tuner_interface(struct dvb_frontend
*fe
)
1722 struct dib9000_state
*st
= fe
->demodulator_priv
;
1723 return &st
->tuner_adap
;
1725 EXPORT_SYMBOL(dib9000_get_tuner_interface
);
1727 struct i2c_adapter
*dib9000_get_component_bus_interface(struct dvb_frontend
*fe
)
1729 struct dib9000_state
*st
= fe
->demodulator_priv
;
1730 return &st
->component_bus
;
1732 EXPORT_SYMBOL(dib9000_get_component_bus_interface
);
1734 struct i2c_adapter
*dib9000_get_i2c_master(struct dvb_frontend
*fe
, enum dibx000_i2c_interface intf
, int gating
)
1736 struct dib9000_state
*st
= fe
->demodulator_priv
;
1737 return dibx000_get_i2c_adapter(&st
->i2c_master
, intf
, gating
);
1739 EXPORT_SYMBOL(dib9000_get_i2c_master
);
1741 int dib9000_set_i2c_adapter(struct dvb_frontend
*fe
, struct i2c_adapter
*i2c
)
1743 struct dib9000_state
*st
= fe
->demodulator_priv
;
1745 st
->i2c
.i2c_adap
= i2c
;
1748 EXPORT_SYMBOL(dib9000_set_i2c_adapter
);
1750 static int dib9000_cfg_gpio(struct dib9000_state
*st
, u8 num
, u8 dir
, u8 val
)
1752 st
->gpio_dir
= dib9000_read_word(st
, 773);
1753 st
->gpio_dir
&= ~(1 << num
); /* reset the direction bit */
1754 st
->gpio_dir
|= (dir
& 0x1) << num
; /* set the new direction */
1755 dib9000_write_word(st
, 773, st
->gpio_dir
);
1757 st
->gpio_val
= dib9000_read_word(st
, 774);
1758 st
->gpio_val
&= ~(1 << num
); /* reset the direction bit */
1759 st
->gpio_val
|= (val
& 0x01) << num
; /* set the new value */
1760 dib9000_write_word(st
, 774, st
->gpio_val
);
1762 dprintk("gpio dir: %04x: gpio val: %04x", st
->gpio_dir
, st
->gpio_val
);
1767 int dib9000_set_gpio(struct dvb_frontend
*fe
, u8 num
, u8 dir
, u8 val
)
1769 struct dib9000_state
*state
= fe
->demodulator_priv
;
1770 return dib9000_cfg_gpio(state
, num
, dir
, val
);
1772 EXPORT_SYMBOL(dib9000_set_gpio
);
1774 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend
*fe
, u8 onoff
)
1776 struct dib9000_state
*state
= fe
->demodulator_priv
;
1780 if ((state
->pid_ctrl_index
!= -2) && (state
->pid_ctrl_index
< 9)) {
1781 /* postpone the pid filtering cmd */
1782 dprintk("pid filter cmd postpone");
1783 state
->pid_ctrl_index
++;
1784 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER_CTRL
;
1785 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1789 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1790 dprintk("could not get the lock");
1794 val
= dib9000_read_word(state
, 294 + 1) & 0xffef;
1795 val
|= (onoff
& 0x1) << 4;
1797 dprintk("PID filter enabled %d", onoff
);
1798 ret
= dib9000_write_word(state
, 294 + 1, val
);
1799 mutex_unlock(&state
->demod_lock
);
1803 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl
);
1805 int dib9000_fw_pid_filter(struct dvb_frontend
*fe
, u8 id
, u16 pid
, u8 onoff
)
1807 struct dib9000_state
*state
= fe
->demodulator_priv
;
1810 if (state
->pid_ctrl_index
!= -2) {
1811 /* postpone the pid filtering cmd */
1812 dprintk("pid filter postpone");
1813 if (state
->pid_ctrl_index
< 9) {
1814 state
->pid_ctrl_index
++;
1815 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER
;
1816 state
->pid_ctrl
[state
->pid_ctrl_index
].id
= id
;
1817 state
->pid_ctrl
[state
->pid_ctrl_index
].pid
= pid
;
1818 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1820 dprintk("can not add any more pid ctrl cmd");
1824 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1825 dprintk("could not get the lock");
1828 dprintk("Index %x, PID %d, OnOff %d", id
, pid
, onoff
);
1829 ret
= dib9000_write_word(state
, 300 + 1 + id
,
1830 onoff
? (1 << 13) | pid
: 0);
1831 mutex_unlock(&state
->demod_lock
);
1834 EXPORT_SYMBOL(dib9000_fw_pid_filter
);
1836 int dib9000_firmware_post_pll_init(struct dvb_frontend
*fe
)
1838 struct dib9000_state
*state
= fe
->demodulator_priv
;
1839 return dib9000_fw_init(state
);
1841 EXPORT_SYMBOL(dib9000_firmware_post_pll_init
);
1843 static void dib9000_release(struct dvb_frontend
*demod
)
1845 struct dib9000_state
*st
= demod
->demodulator_priv
;
1848 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (st
->fe
[index_frontend
] != NULL
); index_frontend
++)
1849 dvb_frontend_detach(st
->fe
[index_frontend
]);
1851 dibx000_exit_i2c_master(&st
->i2c_master
);
1853 i2c_del_adapter(&st
->tuner_adap
);
1854 i2c_del_adapter(&st
->component_bus
);
1859 static int dib9000_wakeup(struct dvb_frontend
*fe
)
1864 static int dib9000_sleep(struct dvb_frontend
*fe
)
1866 struct dib9000_state
*state
= fe
->demodulator_priv
;
1870 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1871 dprintk("could not get the lock");
1874 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1875 ret
= state
->fe
[index_frontend
]->ops
.sleep(state
->fe
[index_frontend
]);
1879 ret
= dib9000_mbx_send(state
, OUT_MSG_FE_SLEEP
, NULL
, 0);
1882 mutex_unlock(&state
->demod_lock
);
1886 static int dib9000_fe_get_tune_settings(struct dvb_frontend
*fe
, struct dvb_frontend_tune_settings
*tune
)
1888 tune
->min_delay_ms
= 1000;
1892 static int dib9000_get_frontend(struct dvb_frontend
*fe
,
1893 struct dtv_frontend_properties
*c
)
1895 struct dib9000_state
*state
= fe
->demodulator_priv
;
1896 u8 index_frontend
, sub_index_frontend
;
1897 enum fe_status stat
;
1900 if (state
->get_frontend_internal
== 0) {
1901 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1902 dprintk("could not get the lock");
1907 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1908 state
->fe
[index_frontend
]->ops
.read_status(state
->fe
[index_frontend
], &stat
);
1909 if (stat
& FE_HAS_SYNC
) {
1910 dprintk("TPS lock on the slave%i", index_frontend
);
1912 /* synchronize the cache with the other frontends */
1913 state
->fe
[index_frontend
]->ops
.get_frontend(state
->fe
[index_frontend
], c
);
1914 for (sub_index_frontend
= 0; (sub_index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[sub_index_frontend
] != NULL
);
1915 sub_index_frontend
++) {
1916 if (sub_index_frontend
!= index_frontend
) {
1917 state
->fe
[sub_index_frontend
]->dtv_property_cache
.modulation
=
1918 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
;
1919 state
->fe
[sub_index_frontend
]->dtv_property_cache
.inversion
=
1920 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
;
1921 state
->fe
[sub_index_frontend
]->dtv_property_cache
.transmission_mode
=
1922 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
;
1923 state
->fe
[sub_index_frontend
]->dtv_property_cache
.guard_interval
=
1924 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
;
1925 state
->fe
[sub_index_frontend
]->dtv_property_cache
.hierarchy
=
1926 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
;
1927 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_HP
=
1928 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
;
1929 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_LP
=
1930 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
;
1931 state
->fe
[sub_index_frontend
]->dtv_property_cache
.rolloff
=
1932 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
;
1940 /* get the channel from master chip */
1941 ret
= dib9000_fw_get_channel(fe
);
1945 /* synchronize the cache with the other frontends */
1946 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1947 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
= c
->inversion
;
1948 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
= c
->transmission_mode
;
1949 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
= c
->guard_interval
;
1950 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
= c
->modulation
;
1951 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
= c
->hierarchy
;
1952 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
= c
->code_rate_HP
;
1953 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
= c
->code_rate_LP
;
1954 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
= c
->rolloff
;
1959 if (state
->get_frontend_internal
== 0)
1960 mutex_unlock(&state
->demod_lock
);
1964 static int dib9000_set_tune_state(struct dvb_frontend
*fe
, enum frontend_tune_state tune_state
)
1966 struct dib9000_state
*state
= fe
->demodulator_priv
;
1967 state
->tune_state
= tune_state
;
1968 if (tune_state
== CT_DEMOD_START
)
1969 state
->status
= FE_STATUS_TUNE_PENDING
;
1974 static u32
dib9000_get_status(struct dvb_frontend
*fe
)
1976 struct dib9000_state
*state
= fe
->demodulator_priv
;
1977 return state
->status
;
1980 static int dib9000_set_channel_status(struct dvb_frontend
*fe
, struct dvb_frontend_parametersContext
*channel_status
)
1982 struct dib9000_state
*state
= fe
->demodulator_priv
;
1984 memcpy(&state
->channel_status
, channel_status
, sizeof(struct dvb_frontend_parametersContext
));
1988 static int dib9000_set_frontend(struct dvb_frontend
*fe
)
1990 struct dib9000_state
*state
= fe
->demodulator_priv
;
1991 int sleep_time
, sleep_time_slave
;
1992 u32 frontend_status
;
1993 u8 nbr_pending
, exit_condition
, index_frontend
, index_frontend_success
;
1994 struct dvb_frontend_parametersContext channel_status
;
1996 /* check that the correct parameters are set */
1997 if (state
->fe
[0]->dtv_property_cache
.frequency
== 0) {
1998 dprintk("dib9000: must specify frequency ");
2002 if (state
->fe
[0]->dtv_property_cache
.bandwidth_hz
== 0) {
2003 dprintk("dib9000: must specify bandwidth ");
2007 state
->pid_ctrl_index
= -1; /* postpone the pid filtering cmd */
2008 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2009 dprintk("could not get the lock");
2013 fe
->dtv_property_cache
.delivery_system
= SYS_DVBT
;
2015 /* set the master status */
2016 if (state
->fe
[0]->dtv_property_cache
.transmission_mode
== TRANSMISSION_MODE_AUTO
||
2017 state
->fe
[0]->dtv_property_cache
.guard_interval
== GUARD_INTERVAL_AUTO
||
2018 state
->fe
[0]->dtv_property_cache
.modulation
== QAM_AUTO
||
2019 state
->fe
[0]->dtv_property_cache
.code_rate_HP
== FEC_AUTO
) {
2020 /* no channel specified, autosearch the channel */
2021 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
2023 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
2025 /* set mode and status for the different frontends */
2026 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2027 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
], 1);
2029 /* synchronization of the cache */
2030 memcpy(&state
->fe
[index_frontend
]->dtv_property_cache
, &fe
->dtv_property_cache
, sizeof(struct dtv_frontend_properties
));
2032 state
->fe
[index_frontend
]->dtv_property_cache
.delivery_system
= SYS_DVBT
;
2033 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_HIGH_Z
);
2035 dib9000_set_channel_status(state
->fe
[index_frontend
], &state
->channel_status
);
2036 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2040 exit_condition
= 0; /* 0: tune pending; 1: tune failed; 2:tune success */
2041 index_frontend_success
= 0;
2043 sleep_time
= dib9000_fw_tune(state
->fe
[0]);
2044 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2045 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2046 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2047 sleep_time
= sleep_time_slave
;
2048 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2049 sleep_time
= sleep_time_slave
;
2051 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2052 msleep(sleep_time
/ 10);
2058 index_frontend_success
= 0;
2059 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2060 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2061 if (frontend_status
> -FE_STATUS_TUNE_PENDING
) {
2062 exit_condition
= 2; /* tune success */
2063 index_frontend_success
= index_frontend
;
2066 if (frontend_status
== -FE_STATUS_TUNE_PENDING
)
2067 nbr_pending
++; /* some frontends are still tuning */
2069 if ((exit_condition
!= 2) && (nbr_pending
== 0))
2070 exit_condition
= 1; /* if all tune are done and no success, exit: tune failed */
2072 } while (exit_condition
== 0);
2074 /* check the tune result */
2075 if (exit_condition
== 1) { /* tune failed */
2076 dprintk("tune failed");
2077 mutex_unlock(&state
->demod_lock
);
2078 /* tune failed; put all the pid filtering cmd to junk */
2079 state
->pid_ctrl_index
= -1;
2083 dprintk("tune success on frontend%i", index_frontend_success
);
2085 /* synchronize all the channel cache */
2086 state
->get_frontend_internal
= 1;
2087 dib9000_get_frontend(state
->fe
[0], &state
->fe
[0]->dtv_property_cache
);
2088 state
->get_frontend_internal
= 0;
2090 /* retune the other frontends with the found channel */
2091 channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
2092 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2093 /* only retune the frontends which was not tuned success */
2094 if (index_frontend
!= index_frontend_success
) {
2095 dib9000_set_channel_status(state
->fe
[index_frontend
], &channel_status
);
2096 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2100 sleep_time
= FE_CALLBACK_TIME_NEVER
;
2101 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2102 if (index_frontend
!= index_frontend_success
) {
2103 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2104 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2105 sleep_time
= sleep_time_slave
;
2106 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2107 sleep_time
= sleep_time_slave
;
2110 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2111 msleep(sleep_time
/ 10);
2116 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2117 if (index_frontend
!= index_frontend_success
) {
2118 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2119 if ((index_frontend
!= index_frontend_success
) && (frontend_status
== -FE_STATUS_TUNE_PENDING
))
2120 nbr_pending
++; /* some frontends are still tuning */
2123 } while (nbr_pending
!= 0);
2125 /* set the output mode */
2126 dib9000_fw_set_output_mode(state
->fe
[0], state
->chip
.d9
.cfg
.output_mode
);
2127 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2128 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_DIVERSITY
);
2130 /* turn off the diversity for the last frontend */
2131 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
- 1], 0);
2133 mutex_unlock(&state
->demod_lock
);
2134 if (state
->pid_ctrl_index
>= 0) {
2135 u8 index_pid_filter_cmd
;
2136 u8 pid_ctrl_index
= state
->pid_ctrl_index
;
2138 state
->pid_ctrl_index
= -2;
2139 for (index_pid_filter_cmd
= 0;
2140 index_pid_filter_cmd
<= pid_ctrl_index
;
2141 index_pid_filter_cmd
++) {
2142 if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER_CTRL
)
2143 dib9000_fw_pid_filter_ctrl(state
->fe
[0],
2144 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2145 else if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER
)
2146 dib9000_fw_pid_filter(state
->fe
[0],
2147 state
->pid_ctrl
[index_pid_filter_cmd
].id
,
2148 state
->pid_ctrl
[index_pid_filter_cmd
].pid
,
2149 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2152 /* do not postpone any more the pid filtering */
2153 state
->pid_ctrl_index
= -2;
2158 static u16
dib9000_read_lock(struct dvb_frontend
*fe
)
2160 struct dib9000_state
*state
= fe
->demodulator_priv
;
2162 return dib9000_read_word(state
, 535);
2165 static int dib9000_read_status(struct dvb_frontend
*fe
, enum fe_status
*stat
)
2167 struct dib9000_state
*state
= fe
->demodulator_priv
;
2169 u16 lock
= 0, lock_slave
= 0;
2171 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2172 dprintk("could not get the lock");
2175 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2176 lock_slave
|= dib9000_read_lock(state
->fe
[index_frontend
]);
2178 lock
= dib9000_read_word(state
, 535);
2182 if ((lock
& 0x8000) || (lock_slave
& 0x8000))
2183 *stat
|= FE_HAS_SIGNAL
;
2184 if ((lock
& 0x3000) || (lock_slave
& 0x3000))
2185 *stat
|= FE_HAS_CARRIER
;
2186 if ((lock
& 0x0100) || (lock_slave
& 0x0100))
2187 *stat
|= FE_HAS_VITERBI
;
2188 if (((lock
& 0x0038) == 0x38) || ((lock_slave
& 0x0038) == 0x38))
2189 *stat
|= FE_HAS_SYNC
;
2190 if ((lock
& 0x0008) || (lock_slave
& 0x0008))
2191 *stat
|= FE_HAS_LOCK
;
2193 mutex_unlock(&state
->demod_lock
);
2198 static int dib9000_read_ber(struct dvb_frontend
*fe
, u32
* ber
)
2200 struct dib9000_state
*state
= fe
->demodulator_priv
;
2204 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2205 dprintk("could not get the lock");
2208 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2209 dprintk("could not get the lock");
2213 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2214 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2218 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
,
2219 state
->i2c_read_buffer
, 16 * 2);
2220 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2222 c
= (u16
*)state
->i2c_read_buffer
;
2224 *ber
= c
[10] << 16 | c
[11];
2227 mutex_unlock(&state
->demod_lock
);
2231 static int dib9000_read_signal_strength(struct dvb_frontend
*fe
, u16
* strength
)
2233 struct dib9000_state
*state
= fe
->demodulator_priv
;
2235 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2239 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2240 dprintk("could not get the lock");
2244 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2245 state
->fe
[index_frontend
]->ops
.read_signal_strength(state
->fe
[index_frontend
], &val
);
2246 if (val
> 65535 - *strength
)
2252 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2253 dprintk("could not get the lock");
2257 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2258 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2262 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2263 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2266 if (val
> 65535 - *strength
)
2272 mutex_unlock(&state
->demod_lock
);
2276 static u32
dib9000_get_snr(struct dvb_frontend
*fe
)
2278 struct dib9000_state
*state
= fe
->demodulator_priv
;
2279 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2283 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2284 dprintk("could not get the lock");
2287 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2288 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2291 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2292 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2295 n
= (val
>> 4) & 0xff;
2296 exp
= ((val
& 0xf) << 2);
2298 exp
+= ((val
>> 14) & 0x3);
2299 if ((exp
& 0x20) != 0)
2303 s
= (val
>> 6) & 0xFF;
2305 if ((exp
& 0x20) != 0)
2310 u32 t
= (s
/ n
) << 16;
2311 return t
+ ((s
<< 16) - n
* t
) / n
;
2316 static int dib9000_read_snr(struct dvb_frontend
*fe
, u16
* snr
)
2318 struct dib9000_state
*state
= fe
->demodulator_priv
;
2322 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2323 dprintk("could not get the lock");
2326 snr_master
= dib9000_get_snr(fe
);
2327 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2328 snr_master
+= dib9000_get_snr(state
->fe
[index_frontend
]);
2330 if ((snr_master
>> 16) != 0) {
2331 snr_master
= 10 * intlog10(snr_master
>> 16);
2332 *snr
= snr_master
/ ((1 << 24) / 10);
2336 mutex_unlock(&state
->demod_lock
);
2341 static int dib9000_read_unc_blocks(struct dvb_frontend
*fe
, u32
* unc
)
2343 struct dib9000_state
*state
= fe
->demodulator_priv
;
2344 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2347 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2348 dprintk("could not get the lock");
2351 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2352 dprintk("could not get the lock");
2356 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2357 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2361 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2362 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2367 mutex_unlock(&state
->demod_lock
);
2371 int dib9000_i2c_enumeration(struct i2c_adapter
*i2c
, int no_of_demods
, u8 default_addr
, u8 first_addr
)
2375 struct i2c_device client
= {.i2c_adap
= i2c
};
2377 client
.i2c_write_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2378 if (!client
.i2c_write_buffer
) {
2379 dprintk("%s: not enough memory", __func__
);
2382 client
.i2c_read_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2383 if (!client
.i2c_read_buffer
) {
2384 dprintk("%s: not enough memory", __func__
);
2389 client
.i2c_addr
= default_addr
+ 16;
2390 dib9000_i2c_write16(&client
, 1796, 0x0);
2392 for (k
= no_of_demods
- 1; k
>= 0; k
--) {
2393 /* designated i2c address */
2394 new_addr
= first_addr
+ (k
<< 1);
2395 client
.i2c_addr
= default_addr
;
2397 dib9000_i2c_write16(&client
, 1817, 3);
2398 dib9000_i2c_write16(&client
, 1796, 0);
2399 dib9000_i2c_write16(&client
, 1227, 1);
2400 dib9000_i2c_write16(&client
, 1227, 0);
2402 client
.i2c_addr
= new_addr
;
2403 dib9000_i2c_write16(&client
, 1817, 3);
2404 dib9000_i2c_write16(&client
, 1796, 0);
2405 dib9000_i2c_write16(&client
, 1227, 1);
2406 dib9000_i2c_write16(&client
, 1227, 0);
2408 if (dib9000_identify(&client
) == 0) {
2409 client
.i2c_addr
= default_addr
;
2410 if (dib9000_identify(&client
) == 0) {
2411 dprintk("DiB9000 #%d: not identified", k
);
2417 dib9000_i2c_write16(&client
, 1795, (1 << 10) | (4 << 6));
2418 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2) | 2);
2420 dprintk("IC %d initialized (to i2c_address 0x%x)", k
, new_addr
);
2423 for (k
= 0; k
< no_of_demods
; k
++) {
2424 new_addr
= first_addr
| (k
<< 1);
2425 client
.i2c_addr
= new_addr
;
2427 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2));
2428 dib9000_i2c_write16(&client
, 1795, 0);
2432 kfree(client
.i2c_read_buffer
);
2434 kfree(client
.i2c_write_buffer
);
2438 EXPORT_SYMBOL(dib9000_i2c_enumeration
);
2440 int dib9000_set_slave_frontend(struct dvb_frontend
*fe
, struct dvb_frontend
*fe_slave
)
2442 struct dib9000_state
*state
= fe
->demodulator_priv
;
2443 u8 index_frontend
= 1;
2445 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2447 if (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) {
2448 dprintk("set slave fe %p to index %i", fe_slave
, index_frontend
);
2449 state
->fe
[index_frontend
] = fe_slave
;
2453 dprintk("too many slave frontend");
2456 EXPORT_SYMBOL(dib9000_set_slave_frontend
);
2458 int dib9000_remove_slave_frontend(struct dvb_frontend
*fe
)
2460 struct dib9000_state
*state
= fe
->demodulator_priv
;
2461 u8 index_frontend
= 1;
2463 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2465 if (index_frontend
!= 1) {
2466 dprintk("remove slave fe %p (index %i)", state
->fe
[index_frontend
- 1], index_frontend
- 1);
2467 state
->fe
[index_frontend
] = NULL
;
2471 dprintk("no frontend to be removed");
2474 EXPORT_SYMBOL(dib9000_remove_slave_frontend
);
2476 struct dvb_frontend
*dib9000_get_slave_frontend(struct dvb_frontend
*fe
, int slave_index
)
2478 struct dib9000_state
*state
= fe
->demodulator_priv
;
2480 if (slave_index
>= MAX_NUMBER_OF_FRONTENDS
)
2482 return state
->fe
[slave_index
];
2484 EXPORT_SYMBOL(dib9000_get_slave_frontend
);
2486 static struct dvb_frontend_ops dib9000_ops
;
2487 struct dvb_frontend
*dib9000_attach(struct i2c_adapter
*i2c_adap
, u8 i2c_addr
, const struct dib9000_config
*cfg
)
2489 struct dvb_frontend
*fe
;
2490 struct dib9000_state
*st
;
2491 st
= kzalloc(sizeof(struct dib9000_state
), GFP_KERNEL
);
2494 fe
= kzalloc(sizeof(struct dvb_frontend
), GFP_KERNEL
);
2500 memcpy(&st
->chip
.d9
.cfg
, cfg
, sizeof(struct dib9000_config
));
2501 st
->i2c
.i2c_adap
= i2c_adap
;
2502 st
->i2c
.i2c_addr
= i2c_addr
;
2503 st
->i2c
.i2c_write_buffer
= st
->i2c_write_buffer
;
2504 st
->i2c
.i2c_read_buffer
= st
->i2c_read_buffer
;
2506 st
->gpio_dir
= DIB9000_GPIO_DEFAULT_DIRECTIONS
;
2507 st
->gpio_val
= DIB9000_GPIO_DEFAULT_VALUES
;
2508 st
->gpio_pwm_pos
= DIB9000_GPIO_DEFAULT_PWM_POS
;
2510 mutex_init(&st
->platform
.risc
.mbx_if_lock
);
2511 mutex_init(&st
->platform
.risc
.mbx_lock
);
2512 mutex_init(&st
->platform
.risc
.mem_lock
);
2513 mutex_init(&st
->platform
.risc
.mem_mbx_lock
);
2514 mutex_init(&st
->demod_lock
);
2515 st
->get_frontend_internal
= 0;
2517 st
->pid_ctrl_index
= -2;
2520 fe
->demodulator_priv
= st
;
2521 memcpy(&st
->fe
[0]->ops
, &dib9000_ops
, sizeof(struct dvb_frontend_ops
));
2523 /* Ensure the output mode remains at the previous default if it's
2524 * not specifically set by the caller.
2526 if ((st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_SERIAL
) && (st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_PAR_GATED_CLK
))
2527 st
->chip
.d9
.cfg
.output_mode
= OUTMODE_MPEG2_FIFO
;
2529 if (dib9000_identify(&st
->i2c
) == 0)
2532 dibx000_init_i2c_master(&st
->i2c_master
, DIB7000MC
, st
->i2c
.i2c_adap
, st
->i2c
.i2c_addr
);
2534 st
->tuner_adap
.dev
.parent
= i2c_adap
->dev
.parent
;
2535 strncpy(st
->tuner_adap
.name
, "DIB9000_FW TUNER ACCESS", sizeof(st
->tuner_adap
.name
));
2536 st
->tuner_adap
.algo
= &dib9000_tuner_algo
;
2537 st
->tuner_adap
.algo_data
= NULL
;
2538 i2c_set_adapdata(&st
->tuner_adap
, st
);
2539 if (i2c_add_adapter(&st
->tuner_adap
) < 0)
2542 st
->component_bus
.dev
.parent
= i2c_adap
->dev
.parent
;
2543 strncpy(st
->component_bus
.name
, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st
->component_bus
.name
));
2544 st
->component_bus
.algo
= &dib9000_component_bus_algo
;
2545 st
->component_bus
.algo_data
= NULL
;
2546 st
->component_bus_speed
= 340;
2547 i2c_set_adapdata(&st
->component_bus
, st
);
2548 if (i2c_add_adapter(&st
->component_bus
) < 0)
2549 goto component_bus_add_error
;
2551 dib9000_fw_reset(fe
);
2555 component_bus_add_error
:
2556 i2c_del_adapter(&st
->tuner_adap
);
2561 EXPORT_SYMBOL(dib9000_attach
);
2563 static struct dvb_frontend_ops dib9000_ops
= {
2564 .delsys
= { SYS_DVBT
},
2566 .name
= "DiBcom 9000",
2567 .frequency_min
= 44250000,
2568 .frequency_max
= 867250000,
2569 .frequency_stepsize
= 62500,
2570 .caps
= FE_CAN_INVERSION_AUTO
|
2571 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
2572 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
2573 FE_CAN_QPSK
| FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
2574 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_RECOVER
| FE_CAN_HIERARCHY_AUTO
,
2577 .release
= dib9000_release
,
2579 .init
= dib9000_wakeup
,
2580 .sleep
= dib9000_sleep
,
2582 .set_frontend
= dib9000_set_frontend
,
2583 .get_tune_settings
= dib9000_fe_get_tune_settings
,
2584 .get_frontend
= dib9000_get_frontend
,
2586 .read_status
= dib9000_read_status
,
2587 .read_ber
= dib9000_read_ber
,
2588 .read_signal_strength
= dib9000_read_signal_strength
,
2589 .read_snr
= dib9000_read_snr
,
2590 .read_ucblocks
= dib9000_read_unc_blocks
,
2593 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2594 MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
2595 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2596 MODULE_LICENSE("GPL");