1 // SPDX-License-Identifier: GPL-2.0-only
3 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
5 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/kernel.h>
11 #include <linux/i2c.h>
12 #include <linux/mutex.h>
14 #include <media/dvb_math.h>
15 #include <media/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(fmt, arg...) do { \
26 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
30 #define MAX_NUMBER_OF_FRONTENDS 6
33 struct i2c_adapter
*i2c_adap
;
39 struct dib9000_pid_ctrl
{
40 #define DIB9000_PID_FILTER_CTRL 0
41 #define DIB9000_PID_FILTER 1
48 struct dib9000_state
{
49 struct i2c_device i2c
;
51 struct dibx000_i2c_master i2c_master
;
52 struct i2c_adapter tuner_adap
;
53 struct i2c_adapter component_bus
;
58 enum frontend_tune_state tune_state
;
60 struct dvb_frontend_parametersContext channel_status
;
64 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
66 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
68 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
71 union { /* common for all chips */
77 struct dib9000_fe_memory_map
{
83 struct mutex mbx_if_lock
; /* to protect read/write operations */
84 struct mutex mbx_lock
; /* to protect the whole mailbox handling */
86 struct mutex mem_lock
; /* to protect the memory accesses */
87 struct mutex mem_mbx_lock
; /* to protect the memory-based mailbox */
89 #define MBX_MAX_WORDS (256 - 200 - 2)
90 #define DIB9000_MSG_CACHE_SIZE 2
91 u16 message_cache
[DIB9000_MSG_CACHE_SIZE
][MBX_MAX_WORDS
];
96 union { /* common for all platforms */
98 struct dib9000_config cfg
;
102 struct dvb_frontend
*fe
[MAX_NUMBER_OF_FRONTENDS
];
103 u16 component_bus_speed
;
105 /* for the I2C transfer */
106 struct i2c_msg msg
[2];
107 u8 i2c_write_buffer
[255];
108 u8 i2c_read_buffer
[255];
109 struct mutex demod_lock
;
110 u8 get_frontend_internal
;
111 struct dib9000_pid_ctrl pid_ctrl
[10];
112 s8 pid_ctrl_index
; /* -1: empty list; -2: do not use the list */
115 static const u32 fe_info
[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0
120 enum dib9000_power_mode
{
121 DIB9000_POWER_ALL
= 0,
124 DIB9000_POWER_INTERF_ANALOG_AGC
,
125 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
,
126 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
,
127 DIB9000_POWER_INTERFACE_ONLY
,
130 enum dib9000_out_messages
{
132 OUT_MSG_HOST_BUF_FAIL
,
134 OUT_MSG_BRIDGE_I2C_W
,
135 OUT_MSG_BRIDGE_I2C_R
,
136 OUT_MSG_BRIDGE_APB_W
,
137 OUT_MSG_BRIDGE_APB_R
,
138 OUT_MSG_SCAN_CHANNEL
,
143 OUT_MSG_ENABLE_TIME_SLICE
,
145 OUT_MSG_FE_CHANNEL_SEARCH
,
146 OUT_MSG_FE_CHANNEL_TUNE
,
154 OUT_MSG_ENABLE_DIVERSITY
,
155 OUT_MSG_SET_OUTPUT_MODE
,
156 OUT_MSG_SET_PRIORITARY_CHANNEL
,
161 enum dib9000_in_messages
{
165 IN_MSG_ACK_FREE_ITEM
,
168 IN_MSG_RAWTS_MONITOR
,
169 IN_MSG_END_BRIDGE_I2C_RW
,
170 IN_MSG_END_BRIDGE_APB_RW
,
175 IN_MSG_FE_FW_DL_DONE
,
177 IN_MSG_ACK_CHANGE_SVC
,
181 /* memory_access requests */
182 #define FE_MM_W_CHANNEL 0
183 #define FE_MM_W_FE_INFO 1
184 #define FE_MM_RW_SYNC 2
186 #define FE_SYNC_CHANNEL 1
187 #define FE_SYNC_W_GENERIC_MONIT 2
188 #define FE_SYNC_COMPONENT_ACCESS 3
190 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
191 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
192 #define FE_MM_R_FE_INFO 5
193 #define FE_MM_R_FE_MONITOR 6
195 #define FE_MM_W_CHANNEL_HEAD 7
196 #define FE_MM_W_CHANNEL_UNION 8
197 #define FE_MM_W_CHANNEL_CONTEXT 9
198 #define FE_MM_R_CHANNEL_UNION 10
199 #define FE_MM_R_CHANNEL_CONTEXT 11
200 #define FE_MM_R_CHANNEL_TUNE_STATE 12
202 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
203 #define FE_MM_W_GENERIC_MONITORING 14
204 #define FE_MM_R_GENERIC_MONITORING 15
206 #define FE_MM_W_COMPONENT_ACCESS 16
207 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
208 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
);
209 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
);
211 static u16
to_fw_output_mode(u16 mode
)
216 case OUTMODE_MPEG2_PAR_GATED_CLK
:
218 case OUTMODE_MPEG2_PAR_CONT_CLK
:
220 case OUTMODE_MPEG2_SERIAL
:
222 case OUTMODE_DIVERSITY
:
224 case OUTMODE_MPEG2_FIFO
:
226 case OUTMODE_ANALOG_ADC
:
233 static int dib9000_read16_attr(struct dib9000_state
*state
, u16 reg
, u8
*b
, u32 len
, u16 attribute
)
235 u32 chunk_size
= 126;
239 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024))
240 return dib9000_risc_apb_access_read(state
, reg
, attribute
, NULL
, 0, b
, len
);
242 memset(state
->msg
, 0, 2 * sizeof(struct i2c_msg
));
243 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
244 state
->msg
[0].flags
= 0;
245 state
->msg
[0].buf
= state
->i2c_write_buffer
;
246 state
->msg
[0].len
= 2;
247 state
->msg
[1].addr
= state
->i2c
.i2c_addr
>> 1;
248 state
->msg
[1].flags
= I2C_M_RD
;
249 state
->msg
[1].buf
= b
;
250 state
->msg
[1].len
= len
;
252 state
->i2c_write_buffer
[0] = reg
>> 8;
253 state
->i2c_write_buffer
[1] = reg
& 0xff;
255 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
256 state
->i2c_write_buffer
[0] |= (1 << 5);
257 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
258 state
->i2c_write_buffer
[0] |= (1 << 4);
261 l
= len
< chunk_size
? len
: chunk_size
;
262 state
->msg
[1].len
= l
;
263 state
->msg
[1].buf
= b
;
264 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 2) != 2 ? -EREMOTEIO
: 0;
266 dprintk("i2c read error on %d\n", reg
);
273 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
275 } while ((ret
== 0) && len
);
280 static u16
dib9000_i2c_read16(struct i2c_device
*i2c
, u16 reg
)
282 struct i2c_msg msg
[2] = {
283 {.addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
284 .buf
= i2c
->i2c_write_buffer
, .len
= 2},
285 {.addr
= i2c
->i2c_addr
>> 1, .flags
= I2C_M_RD
,
286 .buf
= i2c
->i2c_read_buffer
, .len
= 2},
289 i2c
->i2c_write_buffer
[0] = reg
>> 8;
290 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
292 if (i2c_transfer(i2c
->i2c_adap
, msg
, 2) != 2) {
293 dprintk("read register %x error\n", reg
);
297 return (i2c
->i2c_read_buffer
[0] << 8) | i2c
->i2c_read_buffer
[1];
300 static inline u16
dib9000_read_word(struct dib9000_state
*state
, u16 reg
)
302 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2, 0) != 0)
304 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
307 static inline u16
dib9000_read_word_attr(struct dib9000_state
*state
, u16 reg
, u16 attribute
)
309 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2,
312 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
315 #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)
317 static int dib9000_write16_attr(struct dib9000_state
*state
, u16 reg
, const u8
*buf
, u32 len
, u16 attribute
)
319 u32 chunk_size
= 126;
323 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024)) {
324 if (dib9000_risc_apb_access_write
325 (state
, reg
, DATA_BUS_ACCESS_MODE_16BIT
| DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
| attribute
, buf
, len
) != 0)
330 memset(&state
->msg
[0], 0, sizeof(struct i2c_msg
));
331 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
332 state
->msg
[0].flags
= 0;
333 state
->msg
[0].buf
= state
->i2c_write_buffer
;
334 state
->msg
[0].len
= len
+ 2;
336 state
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
337 state
->i2c_write_buffer
[1] = (reg
) & 0xff;
339 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
340 state
->i2c_write_buffer
[0] |= (1 << 5);
341 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
342 state
->i2c_write_buffer
[0] |= (1 << 4);
345 l
= len
< chunk_size
? len
: chunk_size
;
346 state
->msg
[0].len
= l
+ 2;
347 memcpy(&state
->i2c_write_buffer
[2], buf
, l
);
349 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 1) != 1 ? -EREMOTEIO
: 0;
354 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
356 } while ((ret
== 0) && len
);
361 static int dib9000_i2c_write16(struct i2c_device
*i2c
, u16 reg
, u16 val
)
363 struct i2c_msg msg
= {
364 .addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
365 .buf
= i2c
->i2c_write_buffer
, .len
= 4
368 i2c
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
369 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
370 i2c
->i2c_write_buffer
[2] = (val
>> 8) & 0xff;
371 i2c
->i2c_write_buffer
[3] = val
& 0xff;
373 return i2c_transfer(i2c
->i2c_adap
, &msg
, 1) != 1 ? -EREMOTEIO
: 0;
376 static inline int dib9000_write_word(struct dib9000_state
*state
, u16 reg
, u16 val
)
378 u8 b
[2] = { val
>> 8, val
& 0xff };
379 return dib9000_write16_attr(state
, reg
, b
, 2, 0);
382 static inline int dib9000_write_word_attr(struct dib9000_state
*state
, u16 reg
, u16 val
, u16 attribute
)
384 u8 b
[2] = { val
>> 8, val
& 0xff };
385 return dib9000_write16_attr(state
, reg
, b
, 2, attribute
);
388 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
389 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
390 #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))
392 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
393 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
395 #define MAC_IRQ (1 << 1)
396 #define IRQ_POL_MSK (1 << 4)
398 #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)
399 #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)
401 static void dib9000_risc_mem_setup_cmd(struct dib9000_state
*state
, u32 addr
, u32 len
, u8 reading
)
405 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
411 b
[4] = (u8
) (addr
>> 8);
412 b
[5] = (u8
) (addr
& 0xff);
416 b
[12] = (u8
) (addr
>> 8);
417 b
[13] = (u8
) (addr
& 0xff);
422 b
[8] = (u8
) (addr
>> 8);
423 b
[9] = (u8
) (addr
& 0xff);
425 dib9000_write(state
, 1056, b
, 14);
427 dib9000_write_word(state
, 1056, (1 << 15) | 1);
428 state
->platform
.risc
.memcmd
= -1; /* if it was called directly reset it - to force a future setup-call to set it */
431 static void dib9000_risc_mem_setup(struct dib9000_state
*state
, u8 cmd
)
433 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
& 0x7f];
434 /* decide whether we need to "refresh" the memory controller */
435 if (state
->platform
.risc
.memcmd
== cmd
&& /* same command */
436 !(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 */
438 dib9000_risc_mem_setup_cmd(state
, m
->addr
, m
->size
, cmd
& 0x80);
439 state
->platform
.risc
.memcmd
= cmd
;
442 static int dib9000_risc_mem_read(struct dib9000_state
*state
, u8 cmd
, u8
* b
, u16 len
)
444 if (!state
->platform
.risc
.fw_is_running
)
447 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_lock
) < 0) {
448 dprintk("could not get the lock\n");
451 dib9000_risc_mem_setup(state
, cmd
| 0x80);
452 dib9000_risc_mem_read_chunks(state
, b
, len
);
453 mutex_unlock(&state
->platform
.risc
.mem_lock
);
457 static int dib9000_risc_mem_write(struct dib9000_state
*state
, u8 cmd
, const u8
* b
)
459 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
];
460 if (!state
->platform
.risc
.fw_is_running
)
463 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_lock
) < 0) {
464 dprintk("could not get the lock\n");
467 dib9000_risc_mem_setup(state
, cmd
);
468 dib9000_risc_mem_write_chunks(state
, b
, m
->size
);
469 mutex_unlock(&state
->platform
.risc
.mem_lock
);
473 static int dib9000_firmware_download(struct dib9000_state
*state
, u8 risc_id
, u16 key
, const u8
* code
, u32 len
)
482 /* config crtl reg */
483 dib9000_write_word(state
, 1024 + offs
, 0x000f);
484 dib9000_write_word(state
, 1025 + offs
, 0);
485 dib9000_write_word(state
, 1031 + offs
, key
);
487 dprintk("going to download %dB of microcode\n", len
);
488 if (dib9000_write16_noinc(state
, 1026 + offs
, (u8
*) code
, (u16
) len
) != 0) {
489 dprintk("error while downloading microcode for RISC %c\n", 'A' + risc_id
);
493 dprintk("Microcode for RISC %c loaded\n", 'A' + risc_id
);
498 static int dib9000_mbx_host_init(struct dib9000_state
*state
, u8 risc_id
)
510 dib9000_write_word(state
, 1027 + mbox_offs
, 0x8000);
512 /* Read reset status */
514 reset_reg
= dib9000_read_word(state
, 1027 + mbox_offs
);
516 } while ((reset_reg
& 0x8000) && --tries
);
518 if (reset_reg
& 0x8000) {
519 dprintk("MBX: init ERROR, no response from RISC %c\n", 'A' + risc_id
);
522 dprintk("MBX: initialized\n");
526 #define MAX_MAILBOX_TRY 100
527 static int dib9000_mbx_send_attr(struct dib9000_state
*state
, u8 id
, u16
* data
, u8 len
, u16 attr
)
535 if (!state
->platform
.risc
.fw_is_running
)
538 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_if_lock
) < 0) {
539 dprintk("could not get the lock\n");
542 tmp
= MAX_MAILBOX_TRY
;
544 size
= dib9000_read_word_attr(state
, 1043, attr
) & 0xff;
545 if ((size
+ len
+ 1) > MBX_MAX_WORDS
&& --tmp
) {
546 dprintk("MBX: RISC mbx full, retrying\n");
552 /*dprintk( "MBX: size: %d\n", size); */
559 dprintk("--> %02x %d %*ph\n", id
, len
+ 1, len
, data
);
562 /* byte-order conversion - works on big (where it is not necessary) or little endian */
564 for (i
= 0; i
< len
; i
++) {
573 if (dib9000_write16_noinc_attr(state
, 1045, b
, 2, attr
) != 0 || dib9000_write16_noinc_attr(state
, 1045, (u8
*) data
, len
* 2, attr
) != 0) {
578 /* update register nb_mes_in_RX */
579 ret
= (u8
) dib9000_write_word_attr(state
, 1043, 1 << 14, attr
);
582 mutex_unlock(&state
->platform
.risc
.mbx_if_lock
);
587 static u8
dib9000_mbx_read(struct dib9000_state
*state
, u16
* data
, u8 risc_id
, u16 attr
)
597 if (!state
->platform
.risc
.fw_is_running
)
600 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_if_lock
) < 0) {
601 dprintk("could not get the lock\n");
609 /* Length and type in the first word */
610 *data
= dib9000_read_word_attr(state
, 1029 + mc_base
, attr
);
613 if (size
<= MBX_MAX_WORDS
) {
615 size
--; /* Initial word already read */
617 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, size
* 2, attr
);
619 /* to word conversion */
620 for (i
= 0; i
< size
; i
++) {
622 *data
= (tmp
>> 8) | (tmp
<< 8);
628 for (i
= 0; i
< size
+ 1; i
++)
629 dprintk("%04x\n", d
[i
]);
633 dprintk("MBX: message is too big for message cache (%d), flushing message\n", size
);
634 size
--; /* Initial word already read */
636 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, 2, attr
);
638 /* Update register nb_mes_in_TX */
639 dib9000_write_word_attr(state
, 1028 + mc_base
, 1 << 14, attr
);
641 mutex_unlock(&state
->platform
.risc
.mbx_if_lock
);
646 static int dib9000_risc_debug_buf(struct dib9000_state
*state
, u16
* data
, u8 size
)
648 u32 ts
= data
[1] << 16 | data
[0];
649 char *b
= (char *)&data
[2];
651 b
[2 * (size
- 2) - 1] = '\0'; /* Bullet proof the buffer */
656 dprintk("RISC%d: %d.%04d %s\n",
658 ts
/ 10000, ts
% 10000, *b
? b
: "<empty>");
662 static int dib9000_mbx_fetch_to_cache(struct dib9000_state
*state
, u16 attr
)
667 /* find a free slot */
668 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
669 block
= state
->platform
.risc
.message_cache
[i
];
671 size
= dib9000_mbx_read(state
, block
, 1, attr
);
673 /* dprintk( "MBX: fetched %04x message to cache\n", *block); */
675 switch (*block
>> 8) {
676 case IN_MSG_DEBUG_BUF
:
677 dib9000_risc_debug_buf(state
, block
+ 1, size
); /* debug-messages are going to be printed right away */
678 *block
= 0; /* free the block */
681 case IN_MSG_DATA
: /* FE-TRACE */
682 dib9000_risc_data_process(state
, block
+ 1, size
);
693 dprintk("MBX: no free cache-slot found for new message...\n");
697 static u8
dib9000_mbx_count(struct dib9000_state
*state
, u8 risc_id
, u16 attr
)
700 return (u8
) (dib9000_read_word_attr(state
, 1028, attr
) >> 10) & 0x1f; /* 5 bit field */
702 return (u8
) (dib9000_read_word_attr(state
, 1044, attr
) >> 8) & 0x7f; /* 7 bit field */
705 static int dib9000_mbx_process(struct dib9000_state
*state
, u16 attr
)
709 if (!state
->platform
.risc
.fw_is_running
)
712 if (mutex_lock_interruptible(&state
->platform
.risc
.mbx_lock
) < 0) {
713 dprintk("could not get the lock\n");
717 if (dib9000_mbx_count(state
, 1, attr
)) /* 1=RiscB */
718 ret
= dib9000_mbx_fetch_to_cache(state
, attr
);
720 dib9000_read_word_attr(state
, 1229, attr
); /* Clear the IRQ */
722 /* dprintk( "cleared IRQ: %x\n", tmp); */
723 mutex_unlock(&state
->platform
.risc
.mbx_lock
);
728 static int dib9000_mbx_get_message_attr(struct dib9000_state
*state
, u16 id
, u16
* msg
, u8
* size
, u16 attr
)
736 /* dib9000_mbx_get_from_cache(); */
737 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
738 block
= state
->platform
.risc
.message_cache
[i
];
739 if ((*block
>> 8) == id
) {
740 *size
= (*block
& 0xff) - 1;
741 memcpy(msg
, block
+ 1, (*size
) * 2);
742 *block
= 0; /* free the block */
743 i
= 0; /* signal that we found a message */
751 if (dib9000_mbx_process(state
, attr
) == -1) /* try to fetch one message - if any */
757 dprintk("waiting for message %d timed out\n", id
);
764 static int dib9000_risc_check_version(struct dib9000_state
*state
)
770 if (dib9000_mbx_send(state
, OUT_MSG_REQ_VERSION
, &fw_version
, 1) != 0)
773 if (dib9000_mbx_get_message(state
, IN_MSG_VERSION
, (u16
*) r
, &size
) < 0)
776 fw_version
= (r
[0] << 8) | r
[1];
777 dprintk("RISC: ver: %d.%02d (IC: %d)\n", fw_version
>> 10, fw_version
& 0x3ff, (r
[2] << 8) | r
[3]);
779 if ((fw_version
>> 10) != 7)
782 switch (fw_version
& 0x3ff) {
791 dprintk("RISC: invalid firmware version");
795 dprintk("RISC: valid firmware version");
799 static int dib9000_fw_boot(struct dib9000_state
*state
, const u8
* codeA
, u32 lenA
, const u8
* codeB
, u32 lenB
)
801 /* Reconfig pool mac ram */
802 dib9000_write_word(state
, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
803 dib9000_write_word(state
, 1226, 0x05);
805 /* Toggles IP crypto to Host APB interface. */
806 dib9000_write_word(state
, 1542, 1);
808 /* Set jump and no jump in the dma box */
809 dib9000_write_word(state
, 1074, 0);
810 dib9000_write_word(state
, 1075, 0);
812 /* Set MAC as APB Master. */
813 dib9000_write_word(state
, 1237, 0);
815 /* Reset the RISCs */
817 dib9000_write_word(state
, 1024, 2);
819 dib9000_write_word(state
, 1024, 15);
821 dib9000_write_word(state
, 1040, 2);
824 dib9000_firmware_download(state
, 0, 0x1234, codeA
, lenA
);
826 dib9000_firmware_download(state
, 1, 0x1234, codeB
, lenB
);
830 dib9000_write_word(state
, 1024, 0);
832 dib9000_write_word(state
, 1040, 0);
835 if (dib9000_mbx_host_init(state
, 0) != 0)
838 if (dib9000_mbx_host_init(state
, 1) != 0)
842 state
->platform
.risc
.fw_is_running
= 1;
844 if (dib9000_risc_check_version(state
) != 0)
847 state
->platform
.risc
.memcmd
= 0xff;
851 static u16
dib9000_identify(struct i2c_device
*client
)
855 value
= dib9000_i2c_read16(client
, 896);
856 if (value
!= 0x01b3) {
857 dprintk("wrong Vendor ID (0x%x)\n", value
);
861 value
= dib9000_i2c_read16(client
, 897);
862 if (value
!= 0x4000 && value
!= 0x4001 && value
!= 0x4002 && value
!= 0x4003 && value
!= 0x4004 && value
!= 0x4005) {
863 dprintk("wrong Device ID (0x%x)\n", value
);
867 /* protect this driver to be used with 7000PC */
868 if (value
== 0x4000 && dib9000_i2c_read16(client
, 769) == 0x4000) {
869 dprintk("this driver does not work with DiB7000PC\n");
875 dprintk("found DiB7000MA/PA/MB/PB\n");
878 dprintk("found DiB7000HC\n");
881 dprintk("found DiB7000MC\n");
884 dprintk("found DiB9000A\n");
887 dprintk("found DiB9000H\n");
890 dprintk("found DiB9000M\n");
897 static void dib9000_set_power_mode(struct dib9000_state
*state
, enum dib9000_power_mode mode
)
899 /* by default everything is going to be powered off */
900 u16 reg_903
= 0x3fff, reg_904
= 0xffff, reg_905
= 0xffff, reg_906
;
903 if (state
->revision
== 0x4003 || state
->revision
== 0x4004 || state
->revision
== 0x4005)
908 reg_906
= dib9000_read_word(state
, 906 + offset
) | 0x3; /* keep settings for RISC */
910 /* now, depending on the requested mode, we power on */
912 /* power up everything in the demod */
913 case DIB9000_POWER_ALL
:
920 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
921 case DIB9000_POWER_INTERFACE_ONLY
: /* TODO power up either SDIO or I2C or SRAM */
922 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
925 case DIB9000_POWER_INTERF_ANALOG_AGC
:
926 reg_903
&= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
927 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
928 reg_906
&= ~((1 << 0));
931 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
:
935 reg_906
&= ~((1 << 0));
938 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
:
942 reg_906
&= ~((1 << 0));
945 case DIB9000_POWER_NO
:
949 /* always power down unused parts */
950 if (!state
->platform
.host
.mobile_mode
)
951 reg_904
|= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
953 /* P_sdio_select_clk = 0 on MC and after */
954 if (state
->revision
!= 0x4000)
957 dib9000_write_word(state
, 903 + offset
, reg_903
);
958 dib9000_write_word(state
, 904 + offset
, reg_904
);
959 dib9000_write_word(state
, 905 + offset
, reg_905
);
960 dib9000_write_word(state
, 906 + offset
, reg_906
);
963 static int dib9000_fw_reset(struct dvb_frontend
*fe
)
965 struct dib9000_state
*state
= fe
->demodulator_priv
;
967 dib9000_write_word(state
, 1817, 0x0003);
969 dib9000_write_word(state
, 1227, 1);
970 dib9000_write_word(state
, 1227, 0);
972 switch ((state
->revision
= dib9000_identify(&state
->i2c
))) {
982 /* reset the i2c-master to use the host interface */
983 dibx000_reset_i2c_master(&state
->i2c_master
);
985 dib9000_set_power_mode(state
, DIB9000_POWER_ALL
);
987 /* unforce divstr regardless whether i2c enumeration was done or not */
988 dib9000_write_word(state
, 1794, dib9000_read_word(state
, 1794) & ~(1 << 1));
989 dib9000_write_word(state
, 1796, 0);
990 dib9000_write_word(state
, 1805, 0x805);
992 /* restart all parts */
993 dib9000_write_word(state
, 898, 0xffff);
994 dib9000_write_word(state
, 899, 0xffff);
995 dib9000_write_word(state
, 900, 0x0001);
996 dib9000_write_word(state
, 901, 0xff19);
997 dib9000_write_word(state
, 902, 0x003c);
999 dib9000_write_word(state
, 898, 0);
1000 dib9000_write_word(state
, 899, 0);
1001 dib9000_write_word(state
, 900, 0);
1002 dib9000_write_word(state
, 901, 0);
1003 dib9000_write_word(state
, 902, 0);
1005 dib9000_write_word(state
, 911, state
->chip
.d9
.cfg
.if_drives
);
1007 dib9000_set_power_mode(state
, DIB9000_POWER_INTERFACE_ONLY
);
1012 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
)
1017 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1020 /* dprintk( "APB access through rd fw %d %x\n", address, attribute); */
1022 mb
[0] = (u16
) address
;
1024 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_R
, mb
, 2, attribute
);
1025 switch (dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
)) {
1028 for (i
= 0; i
< s
; i
++) {
1029 b
[i
* 2] = (mb
[i
+ 1] >> 8) & 0xff;
1030 b
[i
* 2 + 1] = (mb
[i
+ 1]) & 0xff;
1039 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
)
1044 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1050 /* dprintk( "APB access through wr fw %d %x\n", address, attribute); */
1052 mb
[0] = (u16
)address
;
1053 for (i
= 0; i
+ 1 < len
; i
+= 2)
1054 mb
[1 + i
/ 2] = b
[i
] << 8 | b
[i
+ 1];
1056 mb
[1 + len
/ 2] = b
[len
- 1] << 8;
1058 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_W
, mb
, (3 + len
) / 2, attribute
);
1059 return dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
) == 1 ? 0 : -EINVAL
;
1062 static int dib9000_fw_memmbx_sync(struct dib9000_state
*state
, u8 i
)
1066 if (!state
->platform
.risc
.fw_is_running
)
1068 dib9000_risc_mem_write(state
, FE_MM_RW_SYNC
, &i
);
1070 dib9000_risc_mem_read(state
, FE_MM_RW_SYNC
, state
->i2c_read_buffer
, 1);
1071 } while (state
->i2c_read_buffer
[0] && index_loop
--);
1078 static int dib9000_fw_init(struct dib9000_state
*state
)
1080 struct dibGPIOFunction
*f
;
1085 if (dib9000_fw_boot(state
, NULL
, 0, state
->chip
.d9
.cfg
.microcode_B_fe_buffer
, state
->chip
.d9
.cfg
.microcode_B_fe_size
) != 0)
1088 /* initialize the firmware */
1089 for (i
= 0; i
< ARRAY_SIZE(state
->chip
.d9
.cfg
.gpio_function
); i
++) {
1090 f
= &state
->chip
.d9
.cfg
.gpio_function
[i
];
1092 switch (f
->function
) {
1093 case BOARD_GPIO_FUNCTION_COMPONENT_ON
:
1094 b
[0] = (u16
) f
->mask
;
1095 b
[1] = (u16
) f
->direction
;
1096 b
[2] = (u16
) f
->value
;
1098 case BOARD_GPIO_FUNCTION_COMPONENT_OFF
:
1099 b
[3] = (u16
) f
->mask
;
1100 b
[4] = (u16
) f
->direction
;
1101 b
[5] = (u16
) f
->value
;
1106 if (dib9000_mbx_send(state
, OUT_MSG_CONF_GPIO
, b
, 15) != 0)
1110 b
[0] = state
->chip
.d9
.cfg
.subband
.size
; /* type == 0 -> GPIO - PWM not yet supported */
1111 for (i
= 0; i
< state
->chip
.d9
.cfg
.subband
.size
; i
++) {
1112 b
[1 + i
* 4] = state
->chip
.d9
.cfg
.subband
.subband
[i
].f_mhz
;
1113 b
[2 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.mask
;
1114 b
[3 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.direction
;
1115 b
[4 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.value
;
1117 b
[1 + i
* 4] = 0; /* fe_id */
1118 if (dib9000_mbx_send(state
, OUT_MSG_SUBBAND_SEL
, b
, 2 + 4 * i
) != 0)
1121 /* 0 - id, 1 - no_of_frontends */
1122 b
[0] = (0 << 8) | 1;
1123 /* 0 = i2c-address demod, 0 = tuner */
1124 b
[1] = (0 << 8) | (0);
1125 b
[2] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000) >> 16) & 0xffff);
1126 b
[3] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000)) & 0xffff);
1127 b
[4] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
>> 16) & 0xffff);
1128 b
[5] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
) & 0xffff);
1129 b
[6] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
>> 16) & 0xffff);
1130 b
[7] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
) & 0xffff);
1131 b
[29] = state
->chip
.d9
.cfg
.if_drives
;
1132 if (dib9000_mbx_send(state
, OUT_MSG_INIT_DEMOD
, b
, ARRAY_SIZE(b
)) != 0)
1135 if (dib9000_mbx_send(state
, OUT_MSG_FE_FW_DL
, NULL
, 0) != 0)
1138 if (dib9000_mbx_get_message(state
, IN_MSG_FE_FW_DL_DONE
, b
, &size
) < 0)
1141 if (size
> ARRAY_SIZE(b
)) {
1142 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size
,
1143 (int)ARRAY_SIZE(b
));
1147 for (i
= 0; i
< size
; i
+= 2) {
1148 state
->platform
.risc
.fe_mm
[i
/ 2].addr
= b
[i
+ 0];
1149 state
->platform
.risc
.fe_mm
[i
/ 2].size
= b
[i
+ 1];
1155 static void dib9000_fw_set_channel_head(struct dib9000_state
*state
)
1158 u32 freq
= state
->fe
[0]->dtv_property_cache
.frequency
/ 1000;
1159 if (state
->fe_id
% 2)
1162 b
[0] = (u8
) ((freq
>> 0) & 0xff);
1163 b
[1] = (u8
) ((freq
>> 8) & 0xff);
1164 b
[2] = (u8
) ((freq
>> 16) & 0xff);
1165 b
[3] = (u8
) ((freq
>> 24) & 0xff);
1166 b
[4] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 0) & 0xff);
1167 b
[5] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 8) & 0xff);
1168 b
[6] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 16) & 0xff);
1169 b
[7] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 24) & 0xff);
1170 b
[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1171 if (state
->fe
[0]->dtv_property_cache
.delivery_system
== SYS_DVBT
)
1173 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_HEAD
, b
);
1176 static int dib9000_fw_get_channel(struct dvb_frontend
*fe
)
1178 struct dib9000_state
*state
= fe
->demodulator_priv
;
1179 struct dibDVBTChannel
{
1180 s8 spectrum_inversion
;
1194 struct dibDVBTChannel
*ch
;
1197 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
1198 dprintk("could not get the lock\n");
1201 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
1206 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_UNION
,
1207 state
->i2c_read_buffer
, sizeof(struct dibDVBTChannel
));
1208 ch
= (struct dibDVBTChannel
*)state
->i2c_read_buffer
;
1211 switch (ch
->spectrum_inversion
& 0x7) {
1213 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_ON
;
1216 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_OFF
;
1220 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_AUTO
;
1225 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_2K
;
1228 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_4K
;
1231 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_8K
;
1235 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_AUTO
;
1238 switch (ch
->guard
) {
1240 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_32
;
1243 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_16
;
1246 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_8
;
1249 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_4
;
1253 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_AUTO
;
1256 switch (ch
->constellation
) {
1258 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_64
;
1261 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_16
;
1264 state
->fe
[0]->dtv_property_cache
.modulation
= QPSK
;
1268 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_AUTO
;
1273 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_NONE
;
1276 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_1
;
1280 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_AUTO
;
1283 switch (ch
->code_rate_hp
) {
1285 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_1_2
;
1288 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_2_3
;
1291 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_3_4
;
1294 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_5_6
;
1297 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_7_8
;
1301 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_AUTO
;
1304 switch (ch
->code_rate_lp
) {
1306 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_1_2
;
1309 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_2_3
;
1312 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_3_4
;
1315 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_5_6
;
1318 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_7_8
;
1322 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_AUTO
;
1327 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1331 static int dib9000_fw_set_channel_union(struct dvb_frontend
*fe
)
1333 struct dib9000_state
*state
= fe
->demodulator_priv
;
1334 struct dibDVBTChannel
{
1335 s8 spectrum_inversion
;
1349 struct dibDVBTChannel ch
;
1351 switch (state
->fe
[0]->dtv_property_cache
.inversion
) {
1353 ch
.spectrum_inversion
= 1;
1356 ch
.spectrum_inversion
= 0;
1359 case INVERSION_AUTO
:
1360 ch
.spectrum_inversion
= -1;
1363 switch (state
->fe
[0]->dtv_property_cache
.transmission_mode
) {
1364 case TRANSMISSION_MODE_2K
:
1367 case TRANSMISSION_MODE_4K
:
1370 case TRANSMISSION_MODE_8K
:
1374 case TRANSMISSION_MODE_AUTO
:
1378 switch (state
->fe
[0]->dtv_property_cache
.guard_interval
) {
1379 case GUARD_INTERVAL_1_32
:
1382 case GUARD_INTERVAL_1_16
:
1385 case GUARD_INTERVAL_1_8
:
1388 case GUARD_INTERVAL_1_4
:
1392 case GUARD_INTERVAL_AUTO
:
1396 switch (state
->fe
[0]->dtv_property_cache
.modulation
) {
1398 ch
.constellation
= 2;
1401 ch
.constellation
= 1;
1404 ch
.constellation
= 0;
1408 ch
.constellation
= -1;
1411 switch (state
->fe
[0]->dtv_property_cache
.hierarchy
) {
1412 case HIERARCHY_NONE
:
1421 case HIERARCHY_AUTO
:
1426 switch (state
->fe
[0]->dtv_property_cache
.code_rate_HP
) {
1428 ch
.code_rate_hp
= 1;
1431 ch
.code_rate_hp
= 2;
1434 ch
.code_rate_hp
= 3;
1437 ch
.code_rate_hp
= 5;
1440 ch
.code_rate_hp
= 7;
1444 ch
.code_rate_hp
= -1;
1447 switch (state
->fe
[0]->dtv_property_cache
.code_rate_LP
) {
1449 ch
.code_rate_lp
= 1;
1452 ch
.code_rate_lp
= 2;
1455 ch
.code_rate_lp
= 3;
1458 ch
.code_rate_lp
= 5;
1461 ch
.code_rate_lp
= 7;
1465 ch
.code_rate_lp
= -1;
1469 ch
.intlv_native
= 1;
1471 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_UNION
, (u8
*) &ch
);
1476 static int dib9000_fw_tune(struct dvb_frontend
*fe
)
1478 struct dib9000_state
*state
= fe
->demodulator_priv
;
1479 int ret
= 10, search
= state
->channel_status
.status
== CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1482 switch (state
->tune_state
) {
1483 case CT_DEMOD_START
:
1484 dib9000_fw_set_channel_head(state
);
1486 /* write the channel context - a channel is initialized to 0, so it is OK */
1487 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_CONTEXT
, (u8
*) fe_info
);
1488 dib9000_risc_mem_write(state
, FE_MM_W_FE_INFO
, (u8
*) fe_info
);
1491 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_SEARCH
, NULL
, 0);
1493 dib9000_fw_set_channel_union(fe
);
1494 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_TUNE
, NULL
, 0);
1496 state
->tune_state
= CT_DEMOD_STEP_1
;
1498 case CT_DEMOD_STEP_1
:
1500 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_SEARCH_STATE
, state
->i2c_read_buffer
, 1);
1502 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_TUNE_STATE
, state
->i2c_read_buffer
, 1);
1503 i
= (s8
)state
->i2c_read_buffer
[0];
1504 switch (i
) { /* something happened */
1507 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1509 state
->status
= FE_STATUS_DEMOD_SUCCESS
;
1511 state
->tune_state
= CT_DEMOD_STOP
;
1512 state
->status
= FE_STATUS_LOCKED
;
1516 state
->status
= FE_STATUS_TUNE_FAILED
;
1517 state
->tune_state
= CT_DEMOD_STOP
;
1522 ret
= FE_CALLBACK_TIME_NEVER
;
1529 static int dib9000_fw_set_diversity_in(struct dvb_frontend
*fe
, int onoff
)
1531 struct dib9000_state
*state
= fe
->demodulator_priv
;
1532 u16 mode
= (u16
) onoff
;
1533 return dib9000_mbx_send(state
, OUT_MSG_ENABLE_DIVERSITY
, &mode
, 1);
1536 static int dib9000_fw_set_output_mode(struct dvb_frontend
*fe
, int mode
)
1538 struct dib9000_state
*state
= fe
->demodulator_priv
;
1539 u16 outreg
, smo_mode
;
1541 dprintk("setting output mode for demod %p to %d\n", fe
, mode
);
1544 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1545 outreg
= (1 << 10); /* 0x0400 */
1547 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1548 outreg
= (1 << 10) | (1 << 6); /* 0x0440 */
1550 case OUTMODE_MPEG2_SERIAL
:
1551 outreg
= (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1553 case OUTMODE_DIVERSITY
:
1554 outreg
= (1 << 10) | (4 << 6); /* 0x0500 */
1556 case OUTMODE_MPEG2_FIFO
:
1557 outreg
= (1 << 10) | (5 << 6);
1559 case OUTMODE_HIGH_Z
:
1563 dprintk("Unhandled output_mode passed to be set for demod %p\n", &state
->fe
[0]);
1567 dib9000_write_word(state
, 1795, outreg
);
1570 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1571 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1572 case OUTMODE_MPEG2_SERIAL
:
1573 case OUTMODE_MPEG2_FIFO
:
1574 smo_mode
= (dib9000_read_word(state
, 295) & 0x0010) | (1 << 1);
1575 if (state
->chip
.d9
.cfg
.output_mpeg2_in_188_bytes
)
1576 smo_mode
|= (1 << 5);
1577 dib9000_write_word(state
, 295, smo_mode
);
1581 outreg
= to_fw_output_mode(mode
);
1582 return dib9000_mbx_send(state
, OUT_MSG_SET_OUTPUT_MODE
, &outreg
, 1);
1585 static int dib9000_tuner_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1587 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1588 u16 i
, len
, t
, index_msg
;
1590 for (index_msg
= 0; index_msg
< num
; index_msg
++) {
1591 if (msg
[index_msg
].flags
& I2C_M_RD
) { /* read */
1592 len
= msg
[index_msg
].len
;
1596 if (dib9000_read_word(state
, 790) != 0)
1597 dprintk("TunerITF: read busy\n");
1599 dib9000_write_word(state
, 784, (u16
) (msg
[index_msg
].addr
));
1600 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1601 dib9000_write_word(state
, 786, 1); /* start read */
1604 while (dib9000_read_word(state
, 790) != (len
/ 2) && i
)
1608 dprintk("TunerITF: read failed\n");
1610 for (i
= 0; i
< len
; i
+= 2) {
1611 t
= dib9000_read_word(state
, 785);
1612 msg
[index_msg
].buf
[i
] = (t
>> 8) & 0xff;
1613 msg
[index_msg
].buf
[i
+ 1] = (t
) & 0xff;
1615 if (dib9000_read_word(state
, 790) != 0)
1616 dprintk("TunerITF: read more data than expected\n");
1619 while (dib9000_read_word(state
, 789) && i
)
1622 dprintk("TunerITF: write busy\n");
1624 len
= msg
[index_msg
].len
;
1628 for (i
= 0; i
< len
; i
+= 2)
1629 dib9000_write_word(state
, 785, (msg
[index_msg
].buf
[i
] << 8) | msg
[index_msg
].buf
[i
+ 1]);
1630 dib9000_write_word(state
, 784, (u16
) msg
[index_msg
].addr
);
1631 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1632 dib9000_write_word(state
, 786, 0); /* start write */
1635 while (dib9000_read_word(state
, 791) > 0 && i
)
1638 dprintk("TunerITF: write failed\n");
1644 int dib9000_fw_set_component_bus_speed(struct dvb_frontend
*fe
, u16 speed
)
1646 struct dib9000_state
*state
= fe
->demodulator_priv
;
1648 state
->component_bus_speed
= speed
;
1651 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed
);
1653 static int dib9000_fw_component_bus_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1655 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1656 u8 type
= 0; /* I2C */
1657 u8 port
= DIBX000_I2C_INTERFACE_GPIO_3_4
;
1658 u16 scl
= state
->component_bus_speed
; /* SCL frequency */
1659 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[FE_MM_RW_COMPONENT_ACCESS_BUFFER
];
1664 p
[2] = msg
[0].addr
<< 1;
1666 p
[3] = (u8
) scl
& 0xff; /* scl */
1667 p
[4] = (u8
) (scl
>> 8);
1672 p
[9] = (u8
) (msg
[0].len
);
1673 p
[10] = (u8
) (msg
[0].len
>> 8);
1674 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
)) {
1675 p
[11] = (u8
) (msg
[1].len
);
1676 p
[12] = (u8
) (msg
[1].len
>> 8);
1682 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
1683 dprintk("could not get the lock\n");
1687 dib9000_risc_mem_write(state
, FE_MM_W_COMPONENT_ACCESS
, p
);
1690 dib9000_risc_mem_setup_cmd(state
, m
->addr
, msg
[0].len
, 0);
1691 dib9000_risc_mem_write_chunks(state
, msg
[0].buf
, msg
[0].len
);
1694 /* do the transaction */
1695 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_COMPONENT_ACCESS
) < 0) {
1696 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1700 /* read back any possible result */
1701 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
))
1702 dib9000_risc_mem_read(state
, FE_MM_RW_COMPONENT_ACCESS_BUFFER
, msg
[1].buf
, msg
[1].len
);
1704 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
1709 static u32
dib9000_i2c_func(struct i2c_adapter
*adapter
)
1711 return I2C_FUNC_I2C
;
1714 static const struct i2c_algorithm dib9000_tuner_algo
= {
1715 .master_xfer
= dib9000_tuner_xfer
,
1716 .functionality
= dib9000_i2c_func
,
1719 static const struct i2c_algorithm dib9000_component_bus_algo
= {
1720 .master_xfer
= dib9000_fw_component_bus_xfer
,
1721 .functionality
= dib9000_i2c_func
,
1724 struct i2c_adapter
*dib9000_get_tuner_interface(struct dvb_frontend
*fe
)
1726 struct dib9000_state
*st
= fe
->demodulator_priv
;
1727 return &st
->tuner_adap
;
1729 EXPORT_SYMBOL(dib9000_get_tuner_interface
);
1731 struct i2c_adapter
*dib9000_get_component_bus_interface(struct dvb_frontend
*fe
)
1733 struct dib9000_state
*st
= fe
->demodulator_priv
;
1734 return &st
->component_bus
;
1736 EXPORT_SYMBOL(dib9000_get_component_bus_interface
);
1738 struct i2c_adapter
*dib9000_get_i2c_master(struct dvb_frontend
*fe
, enum dibx000_i2c_interface intf
, int gating
)
1740 struct dib9000_state
*st
= fe
->demodulator_priv
;
1741 return dibx000_get_i2c_adapter(&st
->i2c_master
, intf
, gating
);
1743 EXPORT_SYMBOL(dib9000_get_i2c_master
);
1745 int dib9000_set_i2c_adapter(struct dvb_frontend
*fe
, struct i2c_adapter
*i2c
)
1747 struct dib9000_state
*st
= fe
->demodulator_priv
;
1749 st
->i2c
.i2c_adap
= i2c
;
1752 EXPORT_SYMBOL(dib9000_set_i2c_adapter
);
1754 static int dib9000_cfg_gpio(struct dib9000_state
*st
, u8 num
, u8 dir
, u8 val
)
1756 st
->gpio_dir
= dib9000_read_word(st
, 773);
1757 st
->gpio_dir
&= ~(1 << num
); /* reset the direction bit */
1758 st
->gpio_dir
|= (dir
& 0x1) << num
; /* set the new direction */
1759 dib9000_write_word(st
, 773, st
->gpio_dir
);
1761 st
->gpio_val
= dib9000_read_word(st
, 774);
1762 st
->gpio_val
&= ~(1 << num
); /* reset the direction bit */
1763 st
->gpio_val
|= (val
& 0x01) << num
; /* set the new value */
1764 dib9000_write_word(st
, 774, st
->gpio_val
);
1766 dprintk("gpio dir: %04x: gpio val: %04x\n", st
->gpio_dir
, st
->gpio_val
);
1771 int dib9000_set_gpio(struct dvb_frontend
*fe
, u8 num
, u8 dir
, u8 val
)
1773 struct dib9000_state
*state
= fe
->demodulator_priv
;
1774 return dib9000_cfg_gpio(state
, num
, dir
, val
);
1776 EXPORT_SYMBOL(dib9000_set_gpio
);
1778 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend
*fe
, u8 onoff
)
1780 struct dib9000_state
*state
= fe
->demodulator_priv
;
1784 if ((state
->pid_ctrl_index
!= -2) && (state
->pid_ctrl_index
< 9)) {
1785 /* postpone the pid filtering cmd */
1786 dprintk("pid filter cmd postpone\n");
1787 state
->pid_ctrl_index
++;
1788 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER_CTRL
;
1789 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1793 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1794 dprintk("could not get the lock\n");
1798 val
= dib9000_read_word(state
, 294 + 1) & 0xffef;
1799 val
|= (onoff
& 0x1) << 4;
1801 dprintk("PID filter enabled %d\n", onoff
);
1802 ret
= dib9000_write_word(state
, 294 + 1, val
);
1803 mutex_unlock(&state
->demod_lock
);
1807 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl
);
1809 int dib9000_fw_pid_filter(struct dvb_frontend
*fe
, u8 id
, u16 pid
, u8 onoff
)
1811 struct dib9000_state
*state
= fe
->demodulator_priv
;
1814 if (state
->pid_ctrl_index
!= -2) {
1815 /* postpone the pid filtering cmd */
1816 dprintk("pid filter postpone\n");
1817 if (state
->pid_ctrl_index
< 9) {
1818 state
->pid_ctrl_index
++;
1819 state
->pid_ctrl
[state
->pid_ctrl_index
].cmd
= DIB9000_PID_FILTER
;
1820 state
->pid_ctrl
[state
->pid_ctrl_index
].id
= id
;
1821 state
->pid_ctrl
[state
->pid_ctrl_index
].pid
= pid
;
1822 state
->pid_ctrl
[state
->pid_ctrl_index
].onoff
= onoff
;
1824 dprintk("can not add any more pid ctrl cmd\n");
1828 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1829 dprintk("could not get the lock\n");
1832 dprintk("Index %x, PID %d, OnOff %d\n", id
, pid
, onoff
);
1833 ret
= dib9000_write_word(state
, 300 + 1 + id
,
1834 onoff
? (1 << 13) | pid
: 0);
1835 mutex_unlock(&state
->demod_lock
);
1838 EXPORT_SYMBOL(dib9000_fw_pid_filter
);
1840 int dib9000_firmware_post_pll_init(struct dvb_frontend
*fe
)
1842 struct dib9000_state
*state
= fe
->demodulator_priv
;
1843 return dib9000_fw_init(state
);
1845 EXPORT_SYMBOL(dib9000_firmware_post_pll_init
);
1847 static void dib9000_release(struct dvb_frontend
*demod
)
1849 struct dib9000_state
*st
= demod
->demodulator_priv
;
1852 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (st
->fe
[index_frontend
] != NULL
); index_frontend
++)
1853 dvb_frontend_detach(st
->fe
[index_frontend
]);
1855 dibx000_exit_i2c_master(&st
->i2c_master
);
1857 i2c_del_adapter(&st
->tuner_adap
);
1858 i2c_del_adapter(&st
->component_bus
);
1863 static int dib9000_wakeup(struct dvb_frontend
*fe
)
1868 static int dib9000_sleep(struct dvb_frontend
*fe
)
1870 struct dib9000_state
*state
= fe
->demodulator_priv
;
1874 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1875 dprintk("could not get the lock\n");
1878 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1879 ret
= state
->fe
[index_frontend
]->ops
.sleep(state
->fe
[index_frontend
]);
1883 ret
= dib9000_mbx_send(state
, OUT_MSG_FE_SLEEP
, NULL
, 0);
1886 mutex_unlock(&state
->demod_lock
);
1890 static int dib9000_fe_get_tune_settings(struct dvb_frontend
*fe
, struct dvb_frontend_tune_settings
*tune
)
1892 tune
->min_delay_ms
= 1000;
1896 static int dib9000_get_frontend(struct dvb_frontend
*fe
,
1897 struct dtv_frontend_properties
*c
)
1899 struct dib9000_state
*state
= fe
->demodulator_priv
;
1900 u8 index_frontend
, sub_index_frontend
;
1901 enum fe_status stat
;
1904 if (state
->get_frontend_internal
== 0) {
1905 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
1906 dprintk("could not get the lock\n");
1911 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1912 state
->fe
[index_frontend
]->ops
.read_status(state
->fe
[index_frontend
], &stat
);
1913 if (stat
& FE_HAS_SYNC
) {
1914 dprintk("TPS lock on the slave%i\n", index_frontend
);
1916 /* synchronize the cache with the other frontends */
1917 state
->fe
[index_frontend
]->ops
.get_frontend(state
->fe
[index_frontend
], c
);
1918 for (sub_index_frontend
= 0; (sub_index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[sub_index_frontend
] != NULL
);
1919 sub_index_frontend
++) {
1920 if (sub_index_frontend
!= index_frontend
) {
1921 state
->fe
[sub_index_frontend
]->dtv_property_cache
.modulation
=
1922 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
;
1923 state
->fe
[sub_index_frontend
]->dtv_property_cache
.inversion
=
1924 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
;
1925 state
->fe
[sub_index_frontend
]->dtv_property_cache
.transmission_mode
=
1926 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
;
1927 state
->fe
[sub_index_frontend
]->dtv_property_cache
.guard_interval
=
1928 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
;
1929 state
->fe
[sub_index_frontend
]->dtv_property_cache
.hierarchy
=
1930 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
;
1931 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_HP
=
1932 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
;
1933 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_LP
=
1934 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
;
1935 state
->fe
[sub_index_frontend
]->dtv_property_cache
.rolloff
=
1936 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
;
1944 /* get the channel from master chip */
1945 ret
= dib9000_fw_get_channel(fe
);
1949 /* synchronize the cache with the other frontends */
1950 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1951 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
= c
->inversion
;
1952 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
= c
->transmission_mode
;
1953 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
= c
->guard_interval
;
1954 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
= c
->modulation
;
1955 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
= c
->hierarchy
;
1956 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
= c
->code_rate_HP
;
1957 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
= c
->code_rate_LP
;
1958 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
= c
->rolloff
;
1963 if (state
->get_frontend_internal
== 0)
1964 mutex_unlock(&state
->demod_lock
);
1968 static int dib9000_set_tune_state(struct dvb_frontend
*fe
, enum frontend_tune_state tune_state
)
1970 struct dib9000_state
*state
= fe
->demodulator_priv
;
1971 state
->tune_state
= tune_state
;
1972 if (tune_state
== CT_DEMOD_START
)
1973 state
->status
= FE_STATUS_TUNE_PENDING
;
1978 static u32
dib9000_get_status(struct dvb_frontend
*fe
)
1980 struct dib9000_state
*state
= fe
->demodulator_priv
;
1981 return state
->status
;
1984 static int dib9000_set_channel_status(struct dvb_frontend
*fe
, struct dvb_frontend_parametersContext
*channel_status
)
1986 struct dib9000_state
*state
= fe
->demodulator_priv
;
1988 memcpy(&state
->channel_status
, channel_status
, sizeof(struct dvb_frontend_parametersContext
));
1992 static int dib9000_set_frontend(struct dvb_frontend
*fe
)
1994 struct dib9000_state
*state
= fe
->demodulator_priv
;
1995 int sleep_time
, sleep_time_slave
;
1996 u32 frontend_status
;
1997 u8 nbr_pending
, exit_condition
, index_frontend
, index_frontend_success
;
1998 struct dvb_frontend_parametersContext channel_status
;
2000 /* check that the correct parameters are set */
2001 if (state
->fe
[0]->dtv_property_cache
.frequency
== 0) {
2002 dprintk("dib9000: must specify frequency\n");
2006 if (state
->fe
[0]->dtv_property_cache
.bandwidth_hz
== 0) {
2007 dprintk("dib9000: must specify bandwidth\n");
2011 state
->pid_ctrl_index
= -1; /* postpone the pid filtering cmd */
2012 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2013 dprintk("could not get the lock\n");
2017 fe
->dtv_property_cache
.delivery_system
= SYS_DVBT
;
2019 /* set the master status */
2020 if (state
->fe
[0]->dtv_property_cache
.transmission_mode
== TRANSMISSION_MODE_AUTO
||
2021 state
->fe
[0]->dtv_property_cache
.guard_interval
== GUARD_INTERVAL_AUTO
||
2022 state
->fe
[0]->dtv_property_cache
.modulation
== QAM_AUTO
||
2023 state
->fe
[0]->dtv_property_cache
.code_rate_HP
== FEC_AUTO
) {
2024 /* no channel specified, autosearch the channel */
2025 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
2027 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
2029 /* set mode and status for the different frontends */
2030 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2031 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
], 1);
2033 /* synchronization of the cache */
2034 memcpy(&state
->fe
[index_frontend
]->dtv_property_cache
, &fe
->dtv_property_cache
, sizeof(struct dtv_frontend_properties
));
2036 state
->fe
[index_frontend
]->dtv_property_cache
.delivery_system
= SYS_DVBT
;
2037 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_HIGH_Z
);
2039 dib9000_set_channel_status(state
->fe
[index_frontend
], &state
->channel_status
);
2040 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2044 exit_condition
= 0; /* 0: tune pending; 1: tune failed; 2:tune success */
2045 index_frontend_success
= 0;
2047 sleep_time
= dib9000_fw_tune(state
->fe
[0]);
2048 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2049 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2050 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2051 sleep_time
= sleep_time_slave
;
2052 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2053 sleep_time
= sleep_time_slave
;
2055 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2056 msleep(sleep_time
/ 10);
2062 index_frontend_success
= 0;
2063 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2064 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2065 if (frontend_status
> -FE_STATUS_TUNE_PENDING
) {
2066 exit_condition
= 2; /* tune success */
2067 index_frontend_success
= index_frontend
;
2070 if (frontend_status
== -FE_STATUS_TUNE_PENDING
)
2071 nbr_pending
++; /* some frontends are still tuning */
2073 if ((exit_condition
!= 2) && (nbr_pending
== 0))
2074 exit_condition
= 1; /* if all tune are done and no success, exit: tune failed */
2076 } while (exit_condition
== 0);
2078 /* check the tune result */
2079 if (exit_condition
== 1) { /* tune failed */
2080 dprintk("tune failed\n");
2081 mutex_unlock(&state
->demod_lock
);
2082 /* tune failed; put all the pid filtering cmd to junk */
2083 state
->pid_ctrl_index
= -1;
2087 dprintk("tune success on frontend%i\n", index_frontend_success
);
2089 /* synchronize all the channel cache */
2090 state
->get_frontend_internal
= 1;
2091 dib9000_get_frontend(state
->fe
[0], &state
->fe
[0]->dtv_property_cache
);
2092 state
->get_frontend_internal
= 0;
2094 /* retune the other frontends with the found channel */
2095 channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
2096 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2097 /* only retune the frontends which was not tuned success */
2098 if (index_frontend
!= index_frontend_success
) {
2099 dib9000_set_channel_status(state
->fe
[index_frontend
], &channel_status
);
2100 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
2104 sleep_time
= FE_CALLBACK_TIME_NEVER
;
2105 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2106 if (index_frontend
!= index_frontend_success
) {
2107 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
]);
2108 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2109 sleep_time
= sleep_time_slave
;
2110 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2111 sleep_time
= sleep_time_slave
;
2114 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2115 msleep(sleep_time
/ 10);
2120 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2121 if (index_frontend
!= index_frontend_success
) {
2122 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2123 if ((index_frontend
!= index_frontend_success
) && (frontend_status
== -FE_STATUS_TUNE_PENDING
))
2124 nbr_pending
++; /* some frontends are still tuning */
2127 } while (nbr_pending
!= 0);
2129 /* set the output mode */
2130 dib9000_fw_set_output_mode(state
->fe
[0], state
->chip
.d9
.cfg
.output_mode
);
2131 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2132 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_DIVERSITY
);
2134 /* turn off the diversity for the last frontend */
2135 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
- 1], 0);
2137 mutex_unlock(&state
->demod_lock
);
2138 if (state
->pid_ctrl_index
>= 0) {
2139 u8 index_pid_filter_cmd
;
2140 u8 pid_ctrl_index
= state
->pid_ctrl_index
;
2142 state
->pid_ctrl_index
= -2;
2143 for (index_pid_filter_cmd
= 0;
2144 index_pid_filter_cmd
<= pid_ctrl_index
;
2145 index_pid_filter_cmd
++) {
2146 if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER_CTRL
)
2147 dib9000_fw_pid_filter_ctrl(state
->fe
[0],
2148 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2149 else if (state
->pid_ctrl
[index_pid_filter_cmd
].cmd
== DIB9000_PID_FILTER
)
2150 dib9000_fw_pid_filter(state
->fe
[0],
2151 state
->pid_ctrl
[index_pid_filter_cmd
].id
,
2152 state
->pid_ctrl
[index_pid_filter_cmd
].pid
,
2153 state
->pid_ctrl
[index_pid_filter_cmd
].onoff
);
2156 /* do not postpone any more the pid filtering */
2157 state
->pid_ctrl_index
= -2;
2162 static u16
dib9000_read_lock(struct dvb_frontend
*fe
)
2164 struct dib9000_state
*state
= fe
->demodulator_priv
;
2166 return dib9000_read_word(state
, 535);
2169 static int dib9000_read_status(struct dvb_frontend
*fe
, enum fe_status
*stat
)
2171 struct dib9000_state
*state
= fe
->demodulator_priv
;
2173 u16 lock
= 0, lock_slave
= 0;
2175 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2176 dprintk("could not get the lock\n");
2179 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2180 lock_slave
|= dib9000_read_lock(state
->fe
[index_frontend
]);
2182 lock
= dib9000_read_word(state
, 535);
2186 if ((lock
& 0x8000) || (lock_slave
& 0x8000))
2187 *stat
|= FE_HAS_SIGNAL
;
2188 if ((lock
& 0x3000) || (lock_slave
& 0x3000))
2189 *stat
|= FE_HAS_CARRIER
;
2190 if ((lock
& 0x0100) || (lock_slave
& 0x0100))
2191 *stat
|= FE_HAS_VITERBI
;
2192 if (((lock
& 0x0038) == 0x38) || ((lock_slave
& 0x0038) == 0x38))
2193 *stat
|= FE_HAS_SYNC
;
2194 if ((lock
& 0x0008) || (lock_slave
& 0x0008))
2195 *stat
|= FE_HAS_LOCK
;
2197 mutex_unlock(&state
->demod_lock
);
2202 static int dib9000_read_ber(struct dvb_frontend
*fe
, u32
* ber
)
2204 struct dib9000_state
*state
= fe
->demodulator_priv
;
2208 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2209 dprintk("could not get the lock\n");
2212 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2213 dprintk("could not get the lock\n");
2217 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2218 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2222 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
,
2223 state
->i2c_read_buffer
, 16 * 2);
2224 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2226 c
= (u16
*)state
->i2c_read_buffer
;
2228 *ber
= c
[10] << 16 | c
[11];
2231 mutex_unlock(&state
->demod_lock
);
2235 static int dib9000_read_signal_strength(struct dvb_frontend
*fe
, u16
* strength
)
2237 struct dib9000_state
*state
= fe
->demodulator_priv
;
2239 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2243 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2244 dprintk("could not get the lock\n");
2248 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2249 state
->fe
[index_frontend
]->ops
.read_signal_strength(state
->fe
[index_frontend
], &val
);
2250 if (val
> 65535 - *strength
)
2256 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2257 dprintk("could not get the lock\n");
2261 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2262 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2266 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2267 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2270 if (val
> 65535 - *strength
)
2276 mutex_unlock(&state
->demod_lock
);
2280 static u32
dib9000_get_snr(struct dvb_frontend
*fe
)
2282 struct dib9000_state
*state
= fe
->demodulator_priv
;
2283 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2287 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2288 dprintk("could not get the lock\n");
2291 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2292 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2295 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2296 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2299 n
= (val
>> 4) & 0xff;
2300 exp
= ((val
& 0xf) << 2);
2302 exp
+= ((val
>> 14) & 0x3);
2303 if ((exp
& 0x20) != 0)
2307 s
= (val
>> 6) & 0xFF;
2309 if ((exp
& 0x20) != 0)
2314 u32 t
= (s
/ n
) << 16;
2315 return t
+ ((s
<< 16) - n
* t
) / n
;
2320 static int dib9000_read_snr(struct dvb_frontend
*fe
, u16
* snr
)
2322 struct dib9000_state
*state
= fe
->demodulator_priv
;
2326 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2327 dprintk("could not get the lock\n");
2330 snr_master
= dib9000_get_snr(fe
);
2331 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2332 snr_master
+= dib9000_get_snr(state
->fe
[index_frontend
]);
2334 if ((snr_master
>> 16) != 0) {
2335 snr_master
= 10 * intlog10(snr_master
>> 16);
2336 *snr
= snr_master
/ ((1 << 24) / 10);
2340 mutex_unlock(&state
->demod_lock
);
2345 static int dib9000_read_unc_blocks(struct dvb_frontend
*fe
, u32
* unc
)
2347 struct dib9000_state
*state
= fe
->demodulator_priv
;
2348 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2351 if (mutex_lock_interruptible(&state
->demod_lock
) < 0) {
2352 dprintk("could not get the lock\n");
2355 if (mutex_lock_interruptible(&state
->platform
.risc
.mem_mbx_lock
) < 0) {
2356 dprintk("could not get the lock\n");
2360 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
2361 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2365 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2366 mutex_unlock(&state
->platform
.risc
.mem_mbx_lock
);
2371 mutex_unlock(&state
->demod_lock
);
2375 int dib9000_i2c_enumeration(struct i2c_adapter
*i2c
, int no_of_demods
, u8 default_addr
, u8 first_addr
)
2379 struct i2c_device client
= {.i2c_adap
= i2c
};
2381 client
.i2c_write_buffer
= kzalloc(4, GFP_KERNEL
);
2382 if (!client
.i2c_write_buffer
) {
2383 dprintk("%s: not enough memory\n", __func__
);
2386 client
.i2c_read_buffer
= kzalloc(4, GFP_KERNEL
);
2387 if (!client
.i2c_read_buffer
) {
2388 dprintk("%s: not enough memory\n", __func__
);
2393 client
.i2c_addr
= default_addr
+ 16;
2394 dib9000_i2c_write16(&client
, 1796, 0x0);
2396 for (k
= no_of_demods
- 1; k
>= 0; k
--) {
2397 /* designated i2c address */
2398 new_addr
= first_addr
+ (k
<< 1);
2399 client
.i2c_addr
= default_addr
;
2401 dib9000_i2c_write16(&client
, 1817, 3);
2402 dib9000_i2c_write16(&client
, 1796, 0);
2403 dib9000_i2c_write16(&client
, 1227, 1);
2404 dib9000_i2c_write16(&client
, 1227, 0);
2406 client
.i2c_addr
= new_addr
;
2407 dib9000_i2c_write16(&client
, 1817, 3);
2408 dib9000_i2c_write16(&client
, 1796, 0);
2409 dib9000_i2c_write16(&client
, 1227, 1);
2410 dib9000_i2c_write16(&client
, 1227, 0);
2412 if (dib9000_identify(&client
) == 0) {
2413 client
.i2c_addr
= default_addr
;
2414 if (dib9000_identify(&client
) == 0) {
2415 dprintk("DiB9000 #%d: not identified\n", k
);
2421 dib9000_i2c_write16(&client
, 1795, (1 << 10) | (4 << 6));
2422 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2) | 2);
2424 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k
, new_addr
);
2427 for (k
= 0; k
< no_of_demods
; k
++) {
2428 new_addr
= first_addr
| (k
<< 1);
2429 client
.i2c_addr
= new_addr
;
2431 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2));
2432 dib9000_i2c_write16(&client
, 1795, 0);
2436 kfree(client
.i2c_read_buffer
);
2438 kfree(client
.i2c_write_buffer
);
2442 EXPORT_SYMBOL(dib9000_i2c_enumeration
);
2444 int dib9000_set_slave_frontend(struct dvb_frontend
*fe
, struct dvb_frontend
*fe_slave
)
2446 struct dib9000_state
*state
= fe
->demodulator_priv
;
2447 u8 index_frontend
= 1;
2449 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2451 if (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) {
2452 dprintk("set slave fe %p to index %i\n", fe_slave
, index_frontend
);
2453 state
->fe
[index_frontend
] = fe_slave
;
2457 dprintk("too many slave frontend\n");
2460 EXPORT_SYMBOL(dib9000_set_slave_frontend
);
2462 struct dvb_frontend
*dib9000_get_slave_frontend(struct dvb_frontend
*fe
, int slave_index
)
2464 struct dib9000_state
*state
= fe
->demodulator_priv
;
2466 if (slave_index
>= MAX_NUMBER_OF_FRONTENDS
)
2468 return state
->fe
[slave_index
];
2470 EXPORT_SYMBOL(dib9000_get_slave_frontend
);
2472 static const struct dvb_frontend_ops dib9000_ops
;
2473 struct dvb_frontend
*dib9000_attach(struct i2c_adapter
*i2c_adap
, u8 i2c_addr
, const struct dib9000_config
*cfg
)
2475 struct dvb_frontend
*fe
;
2476 struct dib9000_state
*st
;
2477 st
= kzalloc(sizeof(struct dib9000_state
), GFP_KERNEL
);
2480 fe
= kzalloc(sizeof(struct dvb_frontend
), GFP_KERNEL
);
2486 memcpy(&st
->chip
.d9
.cfg
, cfg
, sizeof(struct dib9000_config
));
2487 st
->i2c
.i2c_adap
= i2c_adap
;
2488 st
->i2c
.i2c_addr
= i2c_addr
;
2489 st
->i2c
.i2c_write_buffer
= st
->i2c_write_buffer
;
2490 st
->i2c
.i2c_read_buffer
= st
->i2c_read_buffer
;
2492 st
->gpio_dir
= DIB9000_GPIO_DEFAULT_DIRECTIONS
;
2493 st
->gpio_val
= DIB9000_GPIO_DEFAULT_VALUES
;
2494 st
->gpio_pwm_pos
= DIB9000_GPIO_DEFAULT_PWM_POS
;
2496 mutex_init(&st
->platform
.risc
.mbx_if_lock
);
2497 mutex_init(&st
->platform
.risc
.mbx_lock
);
2498 mutex_init(&st
->platform
.risc
.mem_lock
);
2499 mutex_init(&st
->platform
.risc
.mem_mbx_lock
);
2500 mutex_init(&st
->demod_lock
);
2501 st
->get_frontend_internal
= 0;
2503 st
->pid_ctrl_index
= -2;
2506 fe
->demodulator_priv
= st
;
2507 memcpy(&st
->fe
[0]->ops
, &dib9000_ops
, sizeof(struct dvb_frontend_ops
));
2509 /* Ensure the output mode remains at the previous default if it's
2510 * not specifically set by the caller.
2512 if ((st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_SERIAL
) && (st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_PAR_GATED_CLK
))
2513 st
->chip
.d9
.cfg
.output_mode
= OUTMODE_MPEG2_FIFO
;
2515 if (dib9000_identify(&st
->i2c
) == 0)
2518 dibx000_init_i2c_master(&st
->i2c_master
, DIB7000MC
, st
->i2c
.i2c_adap
, st
->i2c
.i2c_addr
);
2520 st
->tuner_adap
.dev
.parent
= i2c_adap
->dev
.parent
;
2521 strscpy(st
->tuner_adap
.name
, "DIB9000_FW TUNER ACCESS",
2522 sizeof(st
->tuner_adap
.name
));
2523 st
->tuner_adap
.algo
= &dib9000_tuner_algo
;
2524 st
->tuner_adap
.algo_data
= NULL
;
2525 i2c_set_adapdata(&st
->tuner_adap
, st
);
2526 if (i2c_add_adapter(&st
->tuner_adap
) < 0)
2529 st
->component_bus
.dev
.parent
= i2c_adap
->dev
.parent
;
2530 strscpy(st
->component_bus
.name
, "DIB9000_FW COMPONENT BUS ACCESS",
2531 sizeof(st
->component_bus
.name
));
2532 st
->component_bus
.algo
= &dib9000_component_bus_algo
;
2533 st
->component_bus
.algo_data
= NULL
;
2534 st
->component_bus_speed
= 340;
2535 i2c_set_adapdata(&st
->component_bus
, st
);
2536 if (i2c_add_adapter(&st
->component_bus
) < 0)
2537 goto component_bus_add_error
;
2539 dib9000_fw_reset(fe
);
2543 component_bus_add_error
:
2544 i2c_del_adapter(&st
->tuner_adap
);
2549 EXPORT_SYMBOL(dib9000_attach
);
2551 static const struct dvb_frontend_ops dib9000_ops
= {
2552 .delsys
= { SYS_DVBT
},
2554 .name
= "DiBcom 9000",
2555 .frequency_min_hz
= 44250 * kHz
,
2556 .frequency_max_hz
= 867250 * kHz
,
2557 .frequency_stepsize_hz
= 62500,
2558 .caps
= FE_CAN_INVERSION_AUTO
|
2559 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
2560 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
2561 FE_CAN_QPSK
| FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
2562 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_RECOVER
| FE_CAN_HIERARCHY_AUTO
,
2565 .release
= dib9000_release
,
2567 .init
= dib9000_wakeup
,
2568 .sleep
= dib9000_sleep
,
2570 .set_frontend
= dib9000_set_frontend
,
2571 .get_tune_settings
= dib9000_fe_get_tune_settings
,
2572 .get_frontend
= dib9000_get_frontend
,
2574 .read_status
= dib9000_read_status
,
2575 .read_ber
= dib9000_read_ber
,
2576 .read_signal_strength
= dib9000_read_signal_strength
,
2577 .read_snr
= dib9000_read_snr
,
2578 .read_ucblocks
= dib9000_read_unc_blocks
,
2581 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2582 MODULE_AUTHOR("Olivier Grenie <olivier.grenie@parrot.com>");
2583 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2584 MODULE_LICENSE("GPL");