2 * Linux-DVB Driver for DiBcom's DiB9000 and demodulator-family.
4 * Copyright (C) 2005-10 DiBcom (http://www.dibcom.fr/)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, version 2.
10 #include <linux/kernel.h>
11 #include <linux/i2c.h>
12 #include <linux/mutex.h>
15 #include "dvb_frontend.h"
18 #include "dibx000_common.h"
21 module_param(debug
, int, 0644);
22 MODULE_PARM_DESC(debug
, "turn on debugging (default: 0)");
24 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB9000: "); printk(args); printk("\n"); } } while (0)
25 #define MAX_NUMBER_OF_FRONTENDS 6
28 struct i2c_adapter
*i2c_adap
;
35 #define DIB_LOCK struct mutex
36 #define DibAcquireLock(lock) do { if (mutex_lock_interruptible(lock) < 0) dprintk("could not get the lock"); } while (0)
37 #define DibReleaseLock(lock) mutex_unlock(lock)
38 #define DibInitLock(lock) mutex_init(lock)
39 #define DibFreeLock(lock)
41 struct dib9000_state
{
42 struct i2c_device i2c
;
44 struct dibx000_i2c_master i2c_master
;
45 struct i2c_adapter tuner_adap
;
46 struct i2c_adapter component_bus
;
51 enum frontend_tune_state tune_state
;
53 struct dvb_frontend_parametersContext channel_status
;
57 #define DIB9000_GPIO_DEFAULT_DIRECTIONS 0xffff
59 #define DIB9000_GPIO_DEFAULT_VALUES 0x0000
61 #define DIB9000_GPIO_DEFAULT_PWM_POS 0xffff
64 union { /* common for all chips */
70 struct dib9000_fe_memory_map
{
76 DIB_LOCK mbx_if_lock
; /* to protect read/write operations */
77 DIB_LOCK mbx_lock
; /* to protect the whole mailbox handling */
79 DIB_LOCK mem_lock
; /* to protect the memory accesses */
80 DIB_LOCK mem_mbx_lock
; /* to protect the memory-based mailbox */
82 #define MBX_MAX_WORDS (256 - 200 - 2)
83 #define DIB9000_MSG_CACHE_SIZE 2
84 u16 message_cache
[DIB9000_MSG_CACHE_SIZE
][MBX_MAX_WORDS
];
89 union { /* common for all platforms */
91 struct dib9000_config cfg
;
95 struct dvb_frontend
*fe
[MAX_NUMBER_OF_FRONTENDS
];
96 u16 component_bus_speed
;
98 /* for the I2C transfer */
99 struct i2c_msg msg
[2];
100 u8 i2c_write_buffer
[255];
101 u8 i2c_read_buffer
[255];
104 static const u32 fe_info
[44] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0
109 enum dib9000_power_mode
{
110 DIB9000_POWER_ALL
= 0,
113 DIB9000_POWER_INTERF_ANALOG_AGC
,
114 DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
,
115 DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
,
116 DIB9000_POWER_INTERFACE_ONLY
,
119 enum dib9000_out_messages
{
121 OUT_MSG_HOST_BUF_FAIL
,
123 OUT_MSG_BRIDGE_I2C_W
,
124 OUT_MSG_BRIDGE_I2C_R
,
125 OUT_MSG_BRIDGE_APB_W
,
126 OUT_MSG_BRIDGE_APB_R
,
127 OUT_MSG_SCAN_CHANNEL
,
132 OUT_MSG_ENABLE_TIME_SLICE
,
134 OUT_MSG_FE_CHANNEL_SEARCH
,
135 OUT_MSG_FE_CHANNEL_TUNE
,
143 OUT_MSG_ENABLE_DIVERSITY
,
144 OUT_MSG_SET_OUTPUT_MODE
,
145 OUT_MSG_SET_PRIORITARY_CHANNEL
,
150 enum dib9000_in_messages
{
154 IN_MSG_ACK_FREE_ITEM
,
157 IN_MSG_RAWTS_MONITOR
,
158 IN_MSG_END_BRIDGE_I2C_RW
,
159 IN_MSG_END_BRIDGE_APB_RW
,
164 IN_MSG_FE_FW_DL_DONE
,
166 IN_MSG_ACK_CHANGE_SVC
,
170 /* memory_access requests */
171 #define FE_MM_W_CHANNEL 0
172 #define FE_MM_W_FE_INFO 1
173 #define FE_MM_RW_SYNC 2
175 #define FE_SYNC_CHANNEL 1
176 #define FE_SYNC_W_GENERIC_MONIT 2
177 #define FE_SYNC_COMPONENT_ACCESS 3
179 #define FE_MM_R_CHANNEL_SEARCH_STATE 3
180 #define FE_MM_R_CHANNEL_UNION_CONTEXT 4
181 #define FE_MM_R_FE_INFO 5
182 #define FE_MM_R_FE_MONITOR 6
184 #define FE_MM_W_CHANNEL_HEAD 7
185 #define FE_MM_W_CHANNEL_UNION 8
186 #define FE_MM_W_CHANNEL_CONTEXT 9
187 #define FE_MM_R_CHANNEL_UNION 10
188 #define FE_MM_R_CHANNEL_CONTEXT 11
189 #define FE_MM_R_CHANNEL_TUNE_STATE 12
191 #define FE_MM_R_GENERIC_MONITORING_SIZE 13
192 #define FE_MM_W_GENERIC_MONITORING 14
193 #define FE_MM_R_GENERIC_MONITORING 15
195 #define FE_MM_W_COMPONENT_ACCESS 16
196 #define FE_MM_RW_COMPONENT_ACCESS_BUFFER 17
197 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
);
198 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
);
200 static u16
to_fw_output_mode(u16 mode
)
205 case OUTMODE_MPEG2_PAR_GATED_CLK
:
207 case OUTMODE_MPEG2_PAR_CONT_CLK
:
209 case OUTMODE_MPEG2_SERIAL
:
211 case OUTMODE_DIVERSITY
:
213 case OUTMODE_MPEG2_FIFO
:
215 case OUTMODE_ANALOG_ADC
:
222 static u16
dib9000_read16_attr(struct dib9000_state
*state
, u16 reg
, u8
* b
, u32 len
, u16 attribute
)
224 u32 chunk_size
= 126;
228 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024))
229 return dib9000_risc_apb_access_read(state
, reg
, attribute
, NULL
, 0, b
, len
);
231 memset(state
->msg
, 0, 2 * sizeof(struct i2c_msg
));
232 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
233 state
->msg
[0].flags
= 0;
234 state
->msg
[0].buf
= state
->i2c_write_buffer
;
235 state
->msg
[0].len
= 2;
236 state
->msg
[1].addr
= state
->i2c
.i2c_addr
>> 1;
237 state
->msg
[1].flags
= I2C_M_RD
;
238 state
->msg
[1].buf
= b
;
239 state
->msg
[1].len
= len
;
241 state
->i2c_write_buffer
[0] = reg
>> 8;
242 state
->i2c_write_buffer
[1] = reg
& 0xff;
244 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
245 state
->i2c_write_buffer
[0] |= (1 << 5);
246 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
247 state
->i2c_write_buffer
[0] |= (1 << 4);
250 l
= len
< chunk_size
? len
: chunk_size
;
251 state
->msg
[1].len
= l
;
252 state
->msg
[1].buf
= b
;
253 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 2) != 2 ? -EREMOTEIO
: 0;
255 dprintk("i2c read error on %d", reg
);
262 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
264 } while ((ret
== 0) && len
);
269 static u16
dib9000_i2c_read16(struct i2c_device
*i2c
, u16 reg
)
271 struct i2c_msg msg
[2] = {
272 {.addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
273 .buf
= i2c
->i2c_write_buffer
, .len
= 2},
274 {.addr
= i2c
->i2c_addr
>> 1, .flags
= I2C_M_RD
,
275 .buf
= i2c
->i2c_read_buffer
, .len
= 2},
278 i2c
->i2c_write_buffer
[0] = reg
>> 8;
279 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
281 if (i2c_transfer(i2c
->i2c_adap
, msg
, 2) != 2) {
282 dprintk("read register %x error", reg
);
286 return (i2c
->i2c_read_buffer
[0] << 8) | i2c
->i2c_read_buffer
[1];
289 static inline u16
dib9000_read_word(struct dib9000_state
*state
, u16 reg
)
291 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2, 0) != 0)
293 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
296 static inline u16
dib9000_read_word_attr(struct dib9000_state
*state
, u16 reg
, u16 attribute
)
298 if (dib9000_read16_attr(state
, reg
, state
->i2c_read_buffer
, 2,
301 return (state
->i2c_read_buffer
[0] << 8) | state
->i2c_read_buffer
[1];
304 #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)
306 static u16
dib9000_write16_attr(struct dib9000_state
*state
, u16 reg
, const u8
* buf
, u32 len
, u16 attribute
)
308 u32 chunk_size
= 126;
312 if (state
->platform
.risc
.fw_is_running
&& (reg
< 1024)) {
313 if (dib9000_risc_apb_access_write
314 (state
, reg
, DATA_BUS_ACCESS_MODE_16BIT
| DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
| attribute
, buf
, len
) != 0)
319 memset(&state
->msg
[0], 0, sizeof(struct i2c_msg
));
320 state
->msg
[0].addr
= state
->i2c
.i2c_addr
>> 1;
321 state
->msg
[0].flags
= 0;
322 state
->msg
[0].buf
= state
->i2c_write_buffer
;
323 state
->msg
[0].len
= len
+ 2;
325 state
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
326 state
->i2c_write_buffer
[1] = (reg
) & 0xff;
328 if (attribute
& DATA_BUS_ACCESS_MODE_8BIT
)
329 state
->i2c_write_buffer
[0] |= (1 << 5);
330 if (attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
)
331 state
->i2c_write_buffer
[0] |= (1 << 4);
334 l
= len
< chunk_size
? len
: chunk_size
;
335 state
->msg
[0].len
= l
+ 2;
336 memcpy(&state
->i2c_write_buffer
[2], buf
, l
);
338 ret
= i2c_transfer(state
->i2c
.i2c_adap
, state
->msg
, 1) != 1 ? -EREMOTEIO
: 0;
343 if (!(attribute
& DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT
))
345 } while ((ret
== 0) && len
);
350 static int dib9000_i2c_write16(struct i2c_device
*i2c
, u16 reg
, u16 val
)
352 struct i2c_msg msg
= {
353 .addr
= i2c
->i2c_addr
>> 1, .flags
= 0,
354 .buf
= i2c
->i2c_write_buffer
, .len
= 4
357 i2c
->i2c_write_buffer
[0] = (reg
>> 8) & 0xff;
358 i2c
->i2c_write_buffer
[1] = reg
& 0xff;
359 i2c
->i2c_write_buffer
[2] = (val
>> 8) & 0xff;
360 i2c
->i2c_write_buffer
[3] = val
& 0xff;
362 return i2c_transfer(i2c
->i2c_adap
, &msg
, 1) != 1 ? -EREMOTEIO
: 0;
365 static inline int dib9000_write_word(struct dib9000_state
*state
, u16 reg
, u16 val
)
367 u8 b
[2] = { val
>> 8, val
& 0xff };
368 return dib9000_write16_attr(state
, reg
, b
, 2, 0);
371 static inline int dib9000_write_word_attr(struct dib9000_state
*state
, u16 reg
, u16 val
, u16 attribute
)
373 u8 b
[2] = { val
>> 8, val
& 0xff };
374 return dib9000_write16_attr(state
, reg
, b
, 2, attribute
);
377 #define dib9000_write(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, 0)
378 #define dib9000_write16_noinc(state, reg, buf, len) dib9000_write16_attr(state, reg, buf, len, DATA_BUS_ACCESS_MODE_NO_ADDRESS_INCREMENT)
379 #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))
381 #define dib9000_mbx_send(state, id, data, len) dib9000_mbx_send_attr(state, id, data, len, 0)
382 #define dib9000_mbx_get_message(state, id, msg, len) dib9000_mbx_get_message_attr(state, id, msg, len, 0)
384 #define MAC_IRQ (1 << 1)
385 #define IRQ_POL_MSK (1 << 4)
387 #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)
388 #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)
390 static void dib9000_risc_mem_setup_cmd(struct dib9000_state
*state
, u32 addr
, u32 len
, u8 reading
)
394 /* dprintk("%d memcmd: %d %d %d\n", state->fe_id, addr, addr+len, len); */
400 b
[4] = (u8
) (addr
>> 8);
401 b
[5] = (u8
) (addr
& 0xff);
405 b
[12] = (u8
) (addr
>> 8);
406 b
[13] = (u8
) (addr
& 0xff);
411 b
[8] = (u8
) (addr
>> 8);
412 b
[9] = (u8
) (addr
& 0xff);
414 dib9000_write(state
, 1056, b
, 14);
416 dib9000_write_word(state
, 1056, (1 << 15) | 1);
417 state
->platform
.risc
.memcmd
= -1; /* if it was called directly reset it - to force a future setup-call to set it */
420 static void dib9000_risc_mem_setup(struct dib9000_state
*state
, u8 cmd
)
422 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
& 0x7f];
423 /* decide whether we need to "refresh" the memory controller */
424 if (state
->platform
.risc
.memcmd
== cmd
&& /* same command */
425 !(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 */
427 dib9000_risc_mem_setup_cmd(state
, m
->addr
, m
->size
, cmd
& 0x80);
428 state
->platform
.risc
.memcmd
= cmd
;
431 static int dib9000_risc_mem_read(struct dib9000_state
*state
, u8 cmd
, u8
* b
, u16 len
)
433 if (!state
->platform
.risc
.fw_is_running
)
436 DibAcquireLock(&state
->platform
.risc
.mem_lock
);
437 dib9000_risc_mem_setup(state
, cmd
| 0x80);
438 dib9000_risc_mem_read_chunks(state
, b
, len
);
439 DibReleaseLock(&state
->platform
.risc
.mem_lock
);
443 static int dib9000_risc_mem_write(struct dib9000_state
*state
, u8 cmd
, const u8
* b
)
445 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[cmd
];
446 if (!state
->platform
.risc
.fw_is_running
)
449 DibAcquireLock(&state
->platform
.risc
.mem_lock
);
450 dib9000_risc_mem_setup(state
, cmd
);
451 dib9000_risc_mem_write_chunks(state
, b
, m
->size
);
452 DibReleaseLock(&state
->platform
.risc
.mem_lock
);
456 static int dib9000_firmware_download(struct dib9000_state
*state
, u8 risc_id
, u16 key
, const u8
* code
, u32 len
)
465 /* config crtl reg */
466 dib9000_write_word(state
, 1024 + offs
, 0x000f);
467 dib9000_write_word(state
, 1025 + offs
, 0);
468 dib9000_write_word(state
, 1031 + offs
, key
);
470 dprintk("going to download %dB of microcode", len
);
471 if (dib9000_write16_noinc(state
, 1026 + offs
, (u8
*) code
, (u16
) len
) != 0) {
472 dprintk("error while downloading microcode for RISC %c", 'A' + risc_id
);
476 dprintk("Microcode for RISC %c loaded", 'A' + risc_id
);
481 static int dib9000_mbx_host_init(struct dib9000_state
*state
, u8 risc_id
)
493 dib9000_write_word(state
, 1027 + mbox_offs
, 0x8000);
495 /* Read reset status */
497 reset_reg
= dib9000_read_word(state
, 1027 + mbox_offs
);
499 } while ((reset_reg
& 0x8000) && --tries
);
501 if (reset_reg
& 0x8000) {
502 dprintk("MBX: init ERROR, no response from RISC %c", 'A' + risc_id
);
505 dprintk("MBX: initialized");
509 #define MAX_MAILBOX_TRY 100
510 static int dib9000_mbx_send_attr(struct dib9000_state
*state
, u8 id
, u16
* data
, u8 len
, u16 attr
)
518 if (!state
->platform
.risc
.fw_is_running
)
521 DibAcquireLock(&state
->platform
.risc
.mbx_if_lock
);
522 tmp
= MAX_MAILBOX_TRY
;
524 size
= dib9000_read_word_attr(state
, 1043, attr
) & 0xff;
525 if ((size
+ len
+ 1) > MBX_MAX_WORDS
&& --tmp
) {
526 dprintk("MBX: RISC mbx full, retrying");
532 /*dprintk( "MBX: size: %d", size); */
539 dprintk("--> %02x %d ", id
, len
+ 1);
540 for (i
= 0; i
< len
; i
++)
541 dprintk("%04x ", data
[i
]);
545 /* byte-order conversion - works on big (where it is not necessary) or little endian */
547 for (i
= 0; i
< len
; i
++) {
556 if (dib9000_write16_noinc_attr(state
, 1045, b
, 2, attr
) != 0 || dib9000_write16_noinc_attr(state
, 1045, (u8
*) data
, len
* 2, attr
) != 0) {
561 /* update register nb_mes_in_RX */
562 ret
= (u8
) dib9000_write_word_attr(state
, 1043, 1 << 14, attr
);
565 DibReleaseLock(&state
->platform
.risc
.mbx_if_lock
);
570 static u8
dib9000_mbx_read(struct dib9000_state
*state
, u16
* data
, u8 risc_id
, u16 attr
)
580 if (!state
->platform
.risc
.fw_is_running
)
583 DibAcquireLock(&state
->platform
.risc
.mbx_if_lock
);
589 /* Length and type in the first word */
590 *data
= dib9000_read_word_attr(state
, 1029 + mc_base
, attr
);
593 if (size
<= MBX_MAX_WORDS
) {
595 size
--; /* Initial word already read */
597 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, size
* 2, attr
);
599 /* to word conversion */
600 for (i
= 0; i
< size
; i
++) {
602 *data
= (tmp
>> 8) | (tmp
<< 8);
608 for (i
= 0; i
< size
+ 1; i
++)
609 dprintk("%04x ", d
[i
]);
613 dprintk("MBX: message is too big for message cache (%d), flushing message", size
);
614 size
--; /* Initial word already read */
616 dib9000_read16_noinc_attr(state
, 1029 + mc_base
, (u8
*) data
, 2, attr
);
618 /* Update register nb_mes_in_TX */
619 dib9000_write_word_attr(state
, 1028 + mc_base
, 1 << 14, attr
);
621 DibReleaseLock(&state
->platform
.risc
.mbx_if_lock
);
626 static int dib9000_risc_debug_buf(struct dib9000_state
*state
, u16
* data
, u8 size
)
628 u32 ts
= data
[1] << 16 | data
[0];
629 char *b
= (char *)&data
[2];
631 b
[2 * (size
- 2) - 1] = '\0'; /* Bullet proof the buffer */
636 dprintk("RISC%d: %d.%04d %s", state
->fe_id
, ts
/ 10000, ts
% 10000, *b
? b
: "<emtpy>");
640 static int dib9000_mbx_fetch_to_cache(struct dib9000_state
*state
, u16 attr
)
645 /* find a free slot */
646 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
647 block
= state
->platform
.risc
.message_cache
[i
];
649 size
= dib9000_mbx_read(state
, block
, 1, attr
);
651 /* dprintk( "MBX: fetched %04x message to cache", *block); */
653 switch (*block
>> 8) {
654 case IN_MSG_DEBUG_BUF
:
655 dib9000_risc_debug_buf(state
, block
+ 1, size
); /* debug-messages are going to be printed right away */
656 *block
= 0; /* free the block */
659 case IN_MSG_DATA
: /* FE-TRACE */
660 dib9000_risc_data_process(state
, block
+ 1, size
);
671 dprintk("MBX: no free cache-slot found for new message...");
675 static u8
dib9000_mbx_count(struct dib9000_state
*state
, u8 risc_id
, u16 attr
)
678 return (u8
) (dib9000_read_word_attr(state
, 1028, attr
) >> 10) & 0x1f; /* 5 bit field */
680 return (u8
) (dib9000_read_word_attr(state
, 1044, attr
) >> 8) & 0x7f; /* 7 bit field */
683 static int dib9000_mbx_process(struct dib9000_state
*state
, u16 attr
)
688 if (!state
->platform
.risc
.fw_is_running
)
691 DibAcquireLock(&state
->platform
.risc
.mbx_lock
);
693 if (dib9000_mbx_count(state
, 1, attr
)) /* 1=RiscB */
694 ret
= dib9000_mbx_fetch_to_cache(state
, attr
);
696 tmp
= dib9000_read_word_attr(state
, 1229, attr
); /* Clear the IRQ */
698 /* dprintk( "cleared IRQ: %x", tmp); */
699 DibReleaseLock(&state
->platform
.risc
.mbx_lock
);
704 static int dib9000_mbx_get_message_attr(struct dib9000_state
*state
, u16 id
, u16
* msg
, u8
* size
, u16 attr
)
712 /* dib9000_mbx_get_from_cache(); */
713 for (i
= 0; i
< DIB9000_MSG_CACHE_SIZE
; i
++) {
714 block
= state
->platform
.risc
.message_cache
[i
];
715 if ((*block
>> 8) == id
) {
716 *size
= (*block
& 0xff) - 1;
717 memcpy(msg
, block
+ 1, (*size
) * 2);
718 *block
= 0; /* free the block */
719 i
= 0; /* signal that we found a message */
727 if (dib9000_mbx_process(state
, attr
) == -1) /* try to fetch one message - if any */
733 dprintk("waiting for message %d timed out", id
);
740 static int dib9000_risc_check_version(struct dib9000_state
*state
)
746 if (dib9000_mbx_send(state
, OUT_MSG_REQ_VERSION
, &fw_version
, 1) != 0)
749 if (dib9000_mbx_get_message(state
, IN_MSG_VERSION
, (u16
*) r
, &size
) < 0)
752 fw_version
= (r
[0] << 8) | r
[1];
753 dprintk("RISC: ver: %d.%02d (IC: %d)", fw_version
>> 10, fw_version
& 0x3ff, (r
[2] << 8) | r
[3]);
755 if ((fw_version
>> 10) != 7)
758 switch (fw_version
& 0x3ff) {
767 dprintk("RISC: invalid firmware version");
771 dprintk("RISC: valid firmware version");
775 static int dib9000_fw_boot(struct dib9000_state
*state
, const u8
* codeA
, u32 lenA
, const u8
* codeB
, u32 lenB
)
777 /* Reconfig pool mac ram */
778 dib9000_write_word(state
, 1225, 0x02); /* A: 8k C, 4 k D - B: 32k C 6 k D - IRAM 96k */
779 dib9000_write_word(state
, 1226, 0x05);
781 /* Toggles IP crypto to Host APB interface. */
782 dib9000_write_word(state
, 1542, 1);
784 /* Set jump and no jump in the dma box */
785 dib9000_write_word(state
, 1074, 0);
786 dib9000_write_word(state
, 1075, 0);
788 /* Set MAC as APB Master. */
789 dib9000_write_word(state
, 1237, 0);
791 /* Reset the RISCs */
793 dib9000_write_word(state
, 1024, 2);
795 dib9000_write_word(state
, 1024, 15);
797 dib9000_write_word(state
, 1040, 2);
800 dib9000_firmware_download(state
, 0, 0x1234, codeA
, lenA
);
802 dib9000_firmware_download(state
, 1, 0x1234, codeB
, lenB
);
806 dib9000_write_word(state
, 1024, 0);
808 dib9000_write_word(state
, 1040, 0);
811 if (dib9000_mbx_host_init(state
, 0) != 0)
814 if (dib9000_mbx_host_init(state
, 1) != 0)
818 state
->platform
.risc
.fw_is_running
= 1;
820 if (dib9000_risc_check_version(state
) != 0)
823 state
->platform
.risc
.memcmd
= 0xff;
827 static u16
dib9000_identify(struct i2c_device
*client
)
831 value
= dib9000_i2c_read16(client
, 896);
832 if (value
!= 0x01b3) {
833 dprintk("wrong Vendor ID (0x%x)", value
);
837 value
= dib9000_i2c_read16(client
, 897);
838 if (value
!= 0x4000 && value
!= 0x4001 && value
!= 0x4002 && value
!= 0x4003 && value
!= 0x4004 && value
!= 0x4005) {
839 dprintk("wrong Device ID (0x%x)", value
);
843 /* protect this driver to be used with 7000PC */
844 if (value
== 0x4000 && dib9000_i2c_read16(client
, 769) == 0x4000) {
845 dprintk("this driver does not work with DiB7000PC");
851 dprintk("found DiB7000MA/PA/MB/PB");
854 dprintk("found DiB7000HC");
857 dprintk("found DiB7000MC");
860 dprintk("found DiB9000A");
863 dprintk("found DiB9000H");
866 dprintk("found DiB9000M");
873 static void dib9000_set_power_mode(struct dib9000_state
*state
, enum dib9000_power_mode mode
)
875 /* by default everything is going to be powered off */
876 u16 reg_903
= 0x3fff, reg_904
= 0xffff, reg_905
= 0xffff, reg_906
;
879 if (state
->revision
== 0x4003 || state
->revision
== 0x4004 || state
->revision
== 0x4005)
884 reg_906
= dib9000_read_word(state
, 906 + offset
) | 0x3; /* keep settings for RISC */
886 /* now, depending on the requested mode, we power on */
888 /* power up everything in the demod */
889 case DIB9000_POWER_ALL
:
896 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO or SRAM) */
897 case DIB9000_POWER_INTERFACE_ONLY
: /* TODO power up either SDIO or I2C or SRAM */
898 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 2));
901 case DIB9000_POWER_INTERF_ANALOG_AGC
:
902 reg_903
&= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10));
903 reg_905
&= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 2));
904 reg_906
&= ~((1 << 0));
907 case DIB9000_POWER_COR4_DINTLV_ICIRM_EQUAL_CFROD
:
911 reg_906
&= ~((1 << 0));
914 case DIB9000_POWER_COR4_CRY_ESRAM_MOUT_NUD
:
918 reg_906
&= ~((1 << 0));
921 case DIB9000_POWER_NO
:
925 /* always power down unused parts */
926 if (!state
->platform
.host
.mobile_mode
)
927 reg_904
|= (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2) | (1 << 1);
929 /* P_sdio_select_clk = 0 on MC and after */
930 if (state
->revision
!= 0x4000)
933 dib9000_write_word(state
, 903 + offset
, reg_903
);
934 dib9000_write_word(state
, 904 + offset
, reg_904
);
935 dib9000_write_word(state
, 905 + offset
, reg_905
);
936 dib9000_write_word(state
, 906 + offset
, reg_906
);
939 static int dib9000_fw_reset(struct dvb_frontend
*fe
)
941 struct dib9000_state
*state
= fe
->demodulator_priv
;
943 dib9000_write_word(state
, 1817, 0x0003);
945 dib9000_write_word(state
, 1227, 1);
946 dib9000_write_word(state
, 1227, 0);
948 switch ((state
->revision
= dib9000_identify(&state
->i2c
))) {
958 /* reset the i2c-master to use the host interface */
959 dibx000_reset_i2c_master(&state
->i2c_master
);
961 dib9000_set_power_mode(state
, DIB9000_POWER_ALL
);
963 /* unforce divstr regardless whether i2c enumeration was done or not */
964 dib9000_write_word(state
, 1794, dib9000_read_word(state
, 1794) & ~(1 << 1));
965 dib9000_write_word(state
, 1796, 0);
966 dib9000_write_word(state
, 1805, 0x805);
968 /* restart all parts */
969 dib9000_write_word(state
, 898, 0xffff);
970 dib9000_write_word(state
, 899, 0xffff);
971 dib9000_write_word(state
, 900, 0x0001);
972 dib9000_write_word(state
, 901, 0xff19);
973 dib9000_write_word(state
, 902, 0x003c);
975 dib9000_write_word(state
, 898, 0);
976 dib9000_write_word(state
, 899, 0);
977 dib9000_write_word(state
, 900, 0);
978 dib9000_write_word(state
, 901, 0);
979 dib9000_write_word(state
, 902, 0);
981 dib9000_write_word(state
, 911, state
->chip
.d9
.cfg
.if_drives
);
983 dib9000_set_power_mode(state
, DIB9000_POWER_INTERFACE_ONLY
);
988 static int dib9000_risc_apb_access_read(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* tx
, u32 txlen
, u8
* b
, u32 len
)
993 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
996 /* dprintk( "APB access thru rd fw %d %x", address, attribute); */
998 mb
[0] = (u16
) address
;
1000 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_R
, mb
, 2, attribute
);
1001 switch (dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
)) {
1004 for (i
= 0; i
< s
; i
++) {
1005 b
[i
* 2] = (mb
[i
+ 1] >> 8) & 0xff;
1006 b
[i
* 2 + 1] = (mb
[i
+ 1]) & 0xff;
1015 static int dib9000_risc_apb_access_write(struct dib9000_state
*state
, u32 address
, u16 attribute
, const u8
* b
, u32 len
)
1020 if (address
>= 1024 || !state
->platform
.risc
.fw_is_running
)
1023 /* dprintk( "APB access thru wr fw %d %x", address, attribute); */
1025 mb
[0] = (unsigned short)address
;
1026 for (i
= 0; i
< len
&& i
< 20; i
+= 2)
1027 mb
[1 + (i
/ 2)] = (b
[i
] << 8 | b
[i
+ 1]);
1029 dib9000_mbx_send_attr(state
, OUT_MSG_BRIDGE_APB_W
, mb
, 1 + len
/ 2, attribute
);
1030 return dib9000_mbx_get_message_attr(state
, IN_MSG_END_BRIDGE_APB_RW
, mb
, &s
, attribute
) == 1 ? 0 : -EINVAL
;
1033 static int dib9000_fw_memmbx_sync(struct dib9000_state
*state
, u8 i
)
1037 if (!state
->platform
.risc
.fw_is_running
)
1039 dib9000_risc_mem_write(state
, FE_MM_RW_SYNC
, &i
);
1041 dib9000_risc_mem_read(state
, FE_MM_RW_SYNC
, state
->i2c_read_buffer
, 1);
1042 } while (state
->i2c_read_buffer
[0] && index_loop
--);
1049 static int dib9000_fw_init(struct dib9000_state
*state
)
1051 struct dibGPIOFunction
*f
;
1056 if (dib9000_fw_boot(state
, NULL
, 0, state
->chip
.d9
.cfg
.microcode_B_fe_buffer
, state
->chip
.d9
.cfg
.microcode_B_fe_size
) != 0)
1059 /* initialize the firmware */
1060 for (i
= 0; i
< ARRAY_SIZE(state
->chip
.d9
.cfg
.gpio_function
); i
++) {
1061 f
= &state
->chip
.d9
.cfg
.gpio_function
[i
];
1063 switch (f
->function
) {
1064 case BOARD_GPIO_FUNCTION_COMPONENT_ON
:
1065 b
[0] = (u16
) f
->mask
;
1066 b
[1] = (u16
) f
->direction
;
1067 b
[2] = (u16
) f
->value
;
1069 case BOARD_GPIO_FUNCTION_COMPONENT_OFF
:
1070 b
[3] = (u16
) f
->mask
;
1071 b
[4] = (u16
) f
->direction
;
1072 b
[5] = (u16
) f
->value
;
1077 if (dib9000_mbx_send(state
, OUT_MSG_CONF_GPIO
, b
, 15) != 0)
1081 b
[0] = state
->chip
.d9
.cfg
.subband
.size
; /* type == 0 -> GPIO - PWM not yet supported */
1082 for (i
= 0; i
< state
->chip
.d9
.cfg
.subband
.size
; i
++) {
1083 b
[1 + i
* 4] = state
->chip
.d9
.cfg
.subband
.subband
[i
].f_mhz
;
1084 b
[2 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.mask
;
1085 b
[3 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.direction
;
1086 b
[4 + i
* 4] = (u16
) state
->chip
.d9
.cfg
.subband
.subband
[i
].gpio
.value
;
1088 b
[1 + i
* 4] = 0; /* fe_id */
1089 if (dib9000_mbx_send(state
, OUT_MSG_SUBBAND_SEL
, b
, 2 + 4 * i
) != 0)
1092 /* 0 - id, 1 - no_of_frontends */
1093 b
[0] = (0 << 8) | 1;
1094 /* 0 = i2c-address demod, 0 = tuner */
1095 b
[1] = (0 << 8) | (0);
1096 b
[2] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000) >> 16) & 0xffff);
1097 b
[3] = (u16
) (((state
->chip
.d9
.cfg
.xtal_clock_khz
* 1000)) & 0xffff);
1098 b
[4] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
>> 16) & 0xffff);
1099 b
[5] = (u16
) ((state
->chip
.d9
.cfg
.vcxo_timer
) & 0xffff);
1100 b
[6] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
>> 16) & 0xffff);
1101 b
[7] = (u16
) ((state
->chip
.d9
.cfg
.timing_frequency
) & 0xffff);
1102 b
[29] = state
->chip
.d9
.cfg
.if_drives
;
1103 if (dib9000_mbx_send(state
, OUT_MSG_INIT_DEMOD
, b
, ARRAY_SIZE(b
)) != 0)
1106 if (dib9000_mbx_send(state
, OUT_MSG_FE_FW_DL
, NULL
, 0) != 0)
1109 if (dib9000_mbx_get_message(state
, IN_MSG_FE_FW_DL_DONE
, b
, &size
) < 0)
1112 if (size
> ARRAY_SIZE(b
)) {
1113 dprintk("error : firmware returned %dbytes needed but the used buffer has only %dbytes\n Firmware init ABORTED", size
,
1114 (int)ARRAY_SIZE(b
));
1118 for (i
= 0; i
< size
; i
+= 2) {
1119 state
->platform
.risc
.fe_mm
[i
/ 2].addr
= b
[i
+ 0];
1120 state
->platform
.risc
.fe_mm
[i
/ 2].size
= b
[i
+ 1];
1126 static void dib9000_fw_set_channel_head(struct dib9000_state
*state
, struct dvb_frontend_parameters
*ch
)
1129 u32 freq
= state
->fe
[0]->dtv_property_cache
.frequency
/ 1000;
1130 if (state
->fe_id
% 2)
1133 b
[0] = (u8
) ((freq
>> 0) & 0xff);
1134 b
[1] = (u8
) ((freq
>> 8) & 0xff);
1135 b
[2] = (u8
) ((freq
>> 16) & 0xff);
1136 b
[3] = (u8
) ((freq
>> 24) & 0xff);
1137 b
[4] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 0) & 0xff);
1138 b
[5] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 8) & 0xff);
1139 b
[6] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 16) & 0xff);
1140 b
[7] = (u8
) ((state
->fe
[0]->dtv_property_cache
.bandwidth_hz
/ 1000 >> 24) & 0xff);
1141 b
[8] = 0x80; /* do not wait for CELL ID when doing autosearch */
1142 if (state
->fe
[0]->dtv_property_cache
.delivery_system
== SYS_DVBT
)
1144 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_HEAD
, b
);
1147 static int dib9000_fw_get_channel(struct dvb_frontend
*fe
, struct dvb_frontend_parameters
*channel
)
1149 struct dib9000_state
*state
= fe
->demodulator_priv
;
1150 struct dibDVBTChannel
{
1151 s8 spectrum_inversion
;
1165 struct dibDVBTChannel
*ch
;
1168 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
1169 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0) {
1174 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_UNION
,
1175 state
->i2c_read_buffer
, sizeof(struct dibDVBTChannel
));
1176 ch
= (struct dibDVBTChannel
*)state
->i2c_read_buffer
;
1179 switch (ch
->spectrum_inversion
& 0x7) {
1181 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_ON
;
1184 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_OFF
;
1188 state
->fe
[0]->dtv_property_cache
.inversion
= INVERSION_AUTO
;
1193 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_2K
;
1196 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_4K
;
1199 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_8K
;
1203 state
->fe
[0]->dtv_property_cache
.transmission_mode
= TRANSMISSION_MODE_AUTO
;
1206 switch (ch
->guard
) {
1208 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_32
;
1211 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_16
;
1214 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_8
;
1217 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_1_4
;
1221 state
->fe
[0]->dtv_property_cache
.guard_interval
= GUARD_INTERVAL_AUTO
;
1224 switch (ch
->constellation
) {
1226 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_64
;
1229 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_16
;
1232 state
->fe
[0]->dtv_property_cache
.modulation
= QPSK
;
1236 state
->fe
[0]->dtv_property_cache
.modulation
= QAM_AUTO
;
1241 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_NONE
;
1244 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_1
;
1248 state
->fe
[0]->dtv_property_cache
.hierarchy
= HIERARCHY_AUTO
;
1251 switch (ch
->code_rate_hp
) {
1253 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_1_2
;
1256 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_2_3
;
1259 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_3_4
;
1262 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_5_6
;
1265 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_7_8
;
1269 state
->fe
[0]->dtv_property_cache
.code_rate_HP
= FEC_AUTO
;
1272 switch (ch
->code_rate_lp
) {
1274 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_1_2
;
1277 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_2_3
;
1280 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_3_4
;
1283 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_5_6
;
1286 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_7_8
;
1290 state
->fe
[0]->dtv_property_cache
.code_rate_LP
= FEC_AUTO
;
1295 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1299 static int dib9000_fw_set_channel_union(struct dvb_frontend
*fe
, struct dvb_frontend_parameters
*channel
)
1301 struct dib9000_state
*state
= fe
->demodulator_priv
;
1302 struct dibDVBTChannel
{
1303 s8 spectrum_inversion
;
1317 struct dibDVBTChannel ch
;
1319 switch (state
->fe
[0]->dtv_property_cache
.inversion
) {
1321 ch
.spectrum_inversion
= 1;
1324 ch
.spectrum_inversion
= 0;
1327 case INVERSION_AUTO
:
1328 ch
.spectrum_inversion
= -1;
1331 switch (state
->fe
[0]->dtv_property_cache
.transmission_mode
) {
1332 case TRANSMISSION_MODE_2K
:
1335 case TRANSMISSION_MODE_4K
:
1338 case TRANSMISSION_MODE_8K
:
1342 case TRANSMISSION_MODE_AUTO
:
1346 switch (state
->fe
[0]->dtv_property_cache
.guard_interval
) {
1347 case GUARD_INTERVAL_1_32
:
1350 case GUARD_INTERVAL_1_16
:
1353 case GUARD_INTERVAL_1_8
:
1356 case GUARD_INTERVAL_1_4
:
1360 case GUARD_INTERVAL_AUTO
:
1364 switch (state
->fe
[0]->dtv_property_cache
.modulation
) {
1366 ch
.constellation
= 2;
1369 ch
.constellation
= 1;
1372 ch
.constellation
= 0;
1376 ch
.constellation
= -1;
1379 switch (state
->fe
[0]->dtv_property_cache
.hierarchy
) {
1380 case HIERARCHY_NONE
:
1389 case HIERARCHY_AUTO
:
1394 switch (state
->fe
[0]->dtv_property_cache
.code_rate_HP
) {
1396 ch
.code_rate_hp
= 1;
1399 ch
.code_rate_hp
= 2;
1402 ch
.code_rate_hp
= 3;
1405 ch
.code_rate_hp
= 5;
1408 ch
.code_rate_hp
= 7;
1412 ch
.code_rate_hp
= -1;
1415 switch (state
->fe
[0]->dtv_property_cache
.code_rate_LP
) {
1417 ch
.code_rate_lp
= 1;
1420 ch
.code_rate_lp
= 2;
1423 ch
.code_rate_lp
= 3;
1426 ch
.code_rate_lp
= 5;
1429 ch
.code_rate_lp
= 7;
1433 ch
.code_rate_lp
= -1;
1437 ch
.intlv_native
= 1;
1439 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_UNION
, (u8
*) &ch
);
1444 static int dib9000_fw_tune(struct dvb_frontend
*fe
, struct dvb_frontend_parameters
*ch
)
1446 struct dib9000_state
*state
= fe
->demodulator_priv
;
1447 int ret
= 10, search
= state
->channel_status
.status
== CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1450 switch (state
->tune_state
) {
1451 case CT_DEMOD_START
:
1452 dib9000_fw_set_channel_head(state
, ch
);
1454 /* write the channel context - a channel is initialized to 0, so it is OK */
1455 dib9000_risc_mem_write(state
, FE_MM_W_CHANNEL_CONTEXT
, (u8
*) fe_info
);
1456 dib9000_risc_mem_write(state
, FE_MM_W_FE_INFO
, (u8
*) fe_info
);
1459 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_SEARCH
, NULL
, 0);
1461 dib9000_fw_set_channel_union(fe
, ch
);
1462 dib9000_mbx_send(state
, OUT_MSG_FE_CHANNEL_TUNE
, NULL
, 0);
1464 state
->tune_state
= CT_DEMOD_STEP_1
;
1466 case CT_DEMOD_STEP_1
:
1468 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_SEARCH_STATE
, state
->i2c_read_buffer
, 1);
1470 dib9000_risc_mem_read(state
, FE_MM_R_CHANNEL_TUNE_STATE
, state
->i2c_read_buffer
, 1);
1471 i
= (s8
)state
->i2c_read_buffer
[0];
1472 switch (i
) { /* something happened */
1475 case -2: /* tps locks are "slower" than MPEG locks -> even in autosearch data is OK here */
1477 state
->status
= FE_STATUS_DEMOD_SUCCESS
;
1479 state
->tune_state
= CT_DEMOD_STOP
;
1480 state
->status
= FE_STATUS_LOCKED
;
1484 state
->status
= FE_STATUS_TUNE_FAILED
;
1485 state
->tune_state
= CT_DEMOD_STOP
;
1490 ret
= FE_CALLBACK_TIME_NEVER
;
1497 static int dib9000_fw_set_diversity_in(struct dvb_frontend
*fe
, int onoff
)
1499 struct dib9000_state
*state
= fe
->demodulator_priv
;
1500 u16 mode
= (u16
) onoff
;
1501 return dib9000_mbx_send(state
, OUT_MSG_ENABLE_DIVERSITY
, &mode
, 1);
1504 static int dib9000_fw_set_output_mode(struct dvb_frontend
*fe
, int mode
)
1506 struct dib9000_state
*state
= fe
->demodulator_priv
;
1507 u16 outreg
, smo_mode
;
1509 dprintk("setting output mode for demod %p to %d", fe
, mode
);
1512 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1513 outreg
= (1 << 10); /* 0x0400 */
1515 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1516 outreg
= (1 << 10) | (1 << 6); /* 0x0440 */
1518 case OUTMODE_MPEG2_SERIAL
:
1519 outreg
= (1 << 10) | (2 << 6) | (0 << 1); /* 0x0482 */
1521 case OUTMODE_DIVERSITY
:
1522 outreg
= (1 << 10) | (4 << 6); /* 0x0500 */
1524 case OUTMODE_MPEG2_FIFO
:
1525 outreg
= (1 << 10) | (5 << 6);
1527 case OUTMODE_HIGH_Z
:
1531 dprintk("Unhandled output_mode passed to be set for demod %p", &state
->fe
[0]);
1535 dib9000_write_word(state
, 1795, outreg
);
1538 case OUTMODE_MPEG2_PAR_GATED_CLK
:
1539 case OUTMODE_MPEG2_PAR_CONT_CLK
:
1540 case OUTMODE_MPEG2_SERIAL
:
1541 case OUTMODE_MPEG2_FIFO
:
1542 smo_mode
= (dib9000_read_word(state
, 295) & 0x0010) | (1 << 1);
1543 if (state
->chip
.d9
.cfg
.output_mpeg2_in_188_bytes
)
1544 smo_mode
|= (1 << 5);
1545 dib9000_write_word(state
, 295, smo_mode
);
1549 outreg
= to_fw_output_mode(mode
);
1550 return dib9000_mbx_send(state
, OUT_MSG_SET_OUTPUT_MODE
, &outreg
, 1);
1553 static int dib9000_tuner_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1555 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1556 u16 i
, len
, t
, index_msg
;
1558 for (index_msg
= 0; index_msg
< num
; index_msg
++) {
1559 if (msg
[index_msg
].flags
& I2C_M_RD
) { /* read */
1560 len
= msg
[index_msg
].len
;
1564 if (dib9000_read_word(state
, 790) != 0)
1565 dprintk("TunerITF: read busy");
1567 dib9000_write_word(state
, 784, (u16
) (msg
[index_msg
].addr
));
1568 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1569 dib9000_write_word(state
, 786, 1); /* start read */
1572 while (dib9000_read_word(state
, 790) != (len
/ 2) && i
)
1576 dprintk("TunerITF: read failed");
1578 for (i
= 0; i
< len
; i
+= 2) {
1579 t
= dib9000_read_word(state
, 785);
1580 msg
[index_msg
].buf
[i
] = (t
>> 8) & 0xff;
1581 msg
[index_msg
].buf
[i
+ 1] = (t
) & 0xff;
1583 if (dib9000_read_word(state
, 790) != 0)
1584 dprintk("TunerITF: read more data than expected");
1587 while (dib9000_read_word(state
, 789) && i
)
1590 dprintk("TunerITF: write busy");
1592 len
= msg
[index_msg
].len
;
1596 for (i
= 0; i
< len
; i
+= 2)
1597 dib9000_write_word(state
, 785, (msg
[index_msg
].buf
[i
] << 8) | msg
[index_msg
].buf
[i
+ 1]);
1598 dib9000_write_word(state
, 784, (u16
) msg
[index_msg
].addr
);
1599 dib9000_write_word(state
, 787, (len
/ 2) - 1);
1600 dib9000_write_word(state
, 786, 0); /* start write */
1603 while (dib9000_read_word(state
, 791) > 0 && i
)
1606 dprintk("TunerITF: write failed");
1612 int dib9000_fw_set_component_bus_speed(struct dvb_frontend
*fe
, u16 speed
)
1614 struct dib9000_state
*state
= fe
->demodulator_priv
;
1616 state
->component_bus_speed
= speed
;
1619 EXPORT_SYMBOL(dib9000_fw_set_component_bus_speed
);
1621 static int dib9000_fw_component_bus_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msg
[], int num
)
1623 struct dib9000_state
*state
= i2c_get_adapdata(i2c_adap
);
1624 u8 type
= 0; /* I2C */
1625 u8 port
= DIBX000_I2C_INTERFACE_GPIO_3_4
;
1626 u16 scl
= state
->component_bus_speed
; /* SCL frequency */
1627 struct dib9000_fe_memory_map
*m
= &state
->platform
.risc
.fe_mm
[FE_MM_RW_COMPONENT_ACCESS_BUFFER
];
1632 p
[2] = msg
[0].addr
<< 1;
1634 p
[3] = (u8
) scl
& 0xff; /* scl */
1635 p
[4] = (u8
) (scl
>> 8);
1640 p
[9] = (u8
) (msg
[0].len
);
1641 p
[10] = (u8
) (msg
[0].len
>> 8);
1642 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
)) {
1643 p
[11] = (u8
) (msg
[1].len
);
1644 p
[12] = (u8
) (msg
[1].len
>> 8);
1650 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
1652 dib9000_risc_mem_write(state
, FE_MM_W_COMPONENT_ACCESS
, p
);
1655 dib9000_risc_mem_setup_cmd(state
, m
->addr
, msg
[0].len
, 0);
1656 dib9000_risc_mem_write_chunks(state
, msg
[0].buf
, msg
[0].len
);
1659 /* do the transaction */
1660 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_COMPONENT_ACCESS
) < 0) {
1661 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1665 /* read back any possible result */
1666 if ((num
> 1) && (msg
[1].flags
& I2C_M_RD
))
1667 dib9000_risc_mem_read(state
, FE_MM_RW_COMPONENT_ACCESS_BUFFER
, msg
[1].buf
, msg
[1].len
);
1669 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
1674 static u32
dib9000_i2c_func(struct i2c_adapter
*adapter
)
1676 return I2C_FUNC_I2C
;
1679 static struct i2c_algorithm dib9000_tuner_algo
= {
1680 .master_xfer
= dib9000_tuner_xfer
,
1681 .functionality
= dib9000_i2c_func
,
1684 static struct i2c_algorithm dib9000_component_bus_algo
= {
1685 .master_xfer
= dib9000_fw_component_bus_xfer
,
1686 .functionality
= dib9000_i2c_func
,
1689 struct i2c_adapter
*dib9000_get_tuner_interface(struct dvb_frontend
*fe
)
1691 struct dib9000_state
*st
= fe
->demodulator_priv
;
1692 return &st
->tuner_adap
;
1694 EXPORT_SYMBOL(dib9000_get_tuner_interface
);
1696 struct i2c_adapter
*dib9000_get_component_bus_interface(struct dvb_frontend
*fe
)
1698 struct dib9000_state
*st
= fe
->demodulator_priv
;
1699 return &st
->component_bus
;
1701 EXPORT_SYMBOL(dib9000_get_component_bus_interface
);
1703 struct i2c_adapter
*dib9000_get_i2c_master(struct dvb_frontend
*fe
, enum dibx000_i2c_interface intf
, int gating
)
1705 struct dib9000_state
*st
= fe
->demodulator_priv
;
1706 return dibx000_get_i2c_adapter(&st
->i2c_master
, intf
, gating
);
1708 EXPORT_SYMBOL(dib9000_get_i2c_master
);
1710 int dib9000_set_i2c_adapter(struct dvb_frontend
*fe
, struct i2c_adapter
*i2c
)
1712 struct dib9000_state
*st
= fe
->demodulator_priv
;
1714 st
->i2c
.i2c_adap
= i2c
;
1717 EXPORT_SYMBOL(dib9000_set_i2c_adapter
);
1719 static int dib9000_cfg_gpio(struct dib9000_state
*st
, u8 num
, u8 dir
, u8 val
)
1721 st
->gpio_dir
= dib9000_read_word(st
, 773);
1722 st
->gpio_dir
&= ~(1 << num
); /* reset the direction bit */
1723 st
->gpio_dir
|= (dir
& 0x1) << num
; /* set the new direction */
1724 dib9000_write_word(st
, 773, st
->gpio_dir
);
1726 st
->gpio_val
= dib9000_read_word(st
, 774);
1727 st
->gpio_val
&= ~(1 << num
); /* reset the direction bit */
1728 st
->gpio_val
|= (val
& 0x01) << num
; /* set the new value */
1729 dib9000_write_word(st
, 774, st
->gpio_val
);
1731 dprintk("gpio dir: %04x: gpio val: %04x", st
->gpio_dir
, st
->gpio_val
);
1736 int dib9000_set_gpio(struct dvb_frontend
*fe
, u8 num
, u8 dir
, u8 val
)
1738 struct dib9000_state
*state
= fe
->demodulator_priv
;
1739 return dib9000_cfg_gpio(state
, num
, dir
, val
);
1741 EXPORT_SYMBOL(dib9000_set_gpio
);
1743 int dib9000_fw_pid_filter_ctrl(struct dvb_frontend
*fe
, u8 onoff
)
1745 struct dib9000_state
*state
= fe
->demodulator_priv
;
1746 u16 val
= dib9000_read_word(state
, 294 + 1) & 0xffef;
1747 val
|= (onoff
& 0x1) << 4;
1749 dprintk("PID filter enabled %d", onoff
);
1750 return dib9000_write_word(state
, 294 + 1, val
);
1752 EXPORT_SYMBOL(dib9000_fw_pid_filter_ctrl
);
1754 int dib9000_fw_pid_filter(struct dvb_frontend
*fe
, u8 id
, u16 pid
, u8 onoff
)
1756 struct dib9000_state
*state
= fe
->demodulator_priv
;
1757 dprintk("Index %x, PID %d, OnOff %d", id
, pid
, onoff
);
1758 return dib9000_write_word(state
, 300 + 1 + id
, onoff
? (1 << 13) | pid
: 0);
1760 EXPORT_SYMBOL(dib9000_fw_pid_filter
);
1762 int dib9000_firmware_post_pll_init(struct dvb_frontend
*fe
)
1764 struct dib9000_state
*state
= fe
->demodulator_priv
;
1765 return dib9000_fw_init(state
);
1767 EXPORT_SYMBOL(dib9000_firmware_post_pll_init
);
1769 static void dib9000_release(struct dvb_frontend
*demod
)
1771 struct dib9000_state
*st
= demod
->demodulator_priv
;
1774 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (st
->fe
[index_frontend
] != NULL
); index_frontend
++)
1775 dvb_frontend_detach(st
->fe
[index_frontend
]);
1777 DibFreeLock(&state
->platform
.risc
.mbx_if_lock
);
1778 DibFreeLock(&state
->platform
.risc
.mbx_lock
);
1779 DibFreeLock(&state
->platform
.risc
.mem_lock
);
1780 DibFreeLock(&state
->platform
.risc
.mem_mbx_lock
);
1781 dibx000_exit_i2c_master(&st
->i2c_master
);
1783 i2c_del_adapter(&st
->tuner_adap
);
1784 i2c_del_adapter(&st
->component_bus
);
1789 static int dib9000_wakeup(struct dvb_frontend
*fe
)
1794 static int dib9000_sleep(struct dvb_frontend
*fe
)
1796 struct dib9000_state
*state
= fe
->demodulator_priv
;
1800 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1801 ret
= state
->fe
[index_frontend
]->ops
.sleep(state
->fe
[index_frontend
]);
1805 return dib9000_mbx_send(state
, OUT_MSG_FE_SLEEP
, NULL
, 0);
1808 static int dib9000_fe_get_tune_settings(struct dvb_frontend
*fe
, struct dvb_frontend_tune_settings
*tune
)
1810 tune
->min_delay_ms
= 1000;
1814 static int dib9000_get_frontend(struct dvb_frontend
*fe
, struct dvb_frontend_parameters
*fep
)
1816 struct dib9000_state
*state
= fe
->demodulator_priv
;
1817 u8 index_frontend
, sub_index_frontend
;
1821 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1822 state
->fe
[index_frontend
]->ops
.read_status(state
->fe
[index_frontend
], &stat
);
1823 if (stat
& FE_HAS_SYNC
) {
1824 dprintk("TPS lock on the slave%i", index_frontend
);
1826 /* synchronize the cache with the other frontends */
1827 state
->fe
[index_frontend
]->ops
.get_frontend(state
->fe
[index_frontend
], fep
);
1828 for (sub_index_frontend
= 0; (sub_index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[sub_index_frontend
] != NULL
);
1829 sub_index_frontend
++) {
1830 if (sub_index_frontend
!= index_frontend
) {
1831 state
->fe
[sub_index_frontend
]->dtv_property_cache
.modulation
=
1832 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
;
1833 state
->fe
[sub_index_frontend
]->dtv_property_cache
.inversion
=
1834 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
;
1835 state
->fe
[sub_index_frontend
]->dtv_property_cache
.transmission_mode
=
1836 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
;
1837 state
->fe
[sub_index_frontend
]->dtv_property_cache
.guard_interval
=
1838 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
;
1839 state
->fe
[sub_index_frontend
]->dtv_property_cache
.hierarchy
=
1840 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
;
1841 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_HP
=
1842 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
;
1843 state
->fe
[sub_index_frontend
]->dtv_property_cache
.code_rate_LP
=
1844 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
;
1845 state
->fe
[sub_index_frontend
]->dtv_property_cache
.rolloff
=
1846 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
;
1853 /* get the channel from master chip */
1854 ret
= dib9000_fw_get_channel(fe
, fep
);
1858 /* synchronize the cache with the other frontends */
1859 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1860 state
->fe
[index_frontend
]->dtv_property_cache
.inversion
= fe
->dtv_property_cache
.inversion
;
1861 state
->fe
[index_frontend
]->dtv_property_cache
.transmission_mode
= fe
->dtv_property_cache
.transmission_mode
;
1862 state
->fe
[index_frontend
]->dtv_property_cache
.guard_interval
= fe
->dtv_property_cache
.guard_interval
;
1863 state
->fe
[index_frontend
]->dtv_property_cache
.modulation
= fe
->dtv_property_cache
.modulation
;
1864 state
->fe
[index_frontend
]->dtv_property_cache
.hierarchy
= fe
->dtv_property_cache
.hierarchy
;
1865 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_HP
= fe
->dtv_property_cache
.code_rate_HP
;
1866 state
->fe
[index_frontend
]->dtv_property_cache
.code_rate_LP
= fe
->dtv_property_cache
.code_rate_LP
;
1867 state
->fe
[index_frontend
]->dtv_property_cache
.rolloff
= fe
->dtv_property_cache
.rolloff
;
1873 static int dib9000_set_tune_state(struct dvb_frontend
*fe
, enum frontend_tune_state tune_state
)
1875 struct dib9000_state
*state
= fe
->demodulator_priv
;
1876 state
->tune_state
= tune_state
;
1877 if (tune_state
== CT_DEMOD_START
)
1878 state
->status
= FE_STATUS_TUNE_PENDING
;
1883 static u32
dib9000_get_status(struct dvb_frontend
*fe
)
1885 struct dib9000_state
*state
= fe
->demodulator_priv
;
1886 return state
->status
;
1889 static int dib9000_set_channel_status(struct dvb_frontend
*fe
, struct dvb_frontend_parametersContext
*channel_status
)
1891 struct dib9000_state
*state
= fe
->demodulator_priv
;
1893 memcpy(&state
->channel_status
, channel_status
, sizeof(struct dvb_frontend_parametersContext
));
1897 static int dib9000_set_frontend(struct dvb_frontend
*fe
, struct dvb_frontend_parameters
*fep
)
1899 struct dib9000_state
*state
= fe
->demodulator_priv
;
1900 int sleep_time
, sleep_time_slave
;
1901 u32 frontend_status
;
1902 u8 nbr_pending
, exit_condition
, index_frontend
, index_frontend_success
;
1903 struct dvb_frontend_parametersContext channel_status
;
1905 /* check that the correct parameters are set */
1906 if (state
->fe
[0]->dtv_property_cache
.frequency
== 0) {
1907 dprintk("dib9000: must specify frequency ");
1911 if (state
->fe
[0]->dtv_property_cache
.bandwidth_hz
== 0) {
1912 dprintk("dib9000: must specify bandwidth ");
1915 fe
->dtv_property_cache
.delivery_system
= SYS_DVBT
;
1917 /* set the master status */
1918 if (fep
->u
.ofdm
.transmission_mode
== TRANSMISSION_MODE_AUTO
||
1919 fep
->u
.ofdm
.guard_interval
== GUARD_INTERVAL_AUTO
|| fep
->u
.ofdm
.constellation
== QAM_AUTO
|| fep
->u
.ofdm
.code_rate_HP
== FEC_AUTO
) {
1920 /* no channel specified, autosearch the channel */
1921 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_UNKNOWN
;
1923 state
->channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
1925 /* set mode and status for the different frontends */
1926 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1927 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
], 1);
1929 /* synchronization of the cache */
1930 memcpy(&state
->fe
[index_frontend
]->dtv_property_cache
, &fe
->dtv_property_cache
, sizeof(struct dtv_frontend_properties
));
1932 state
->fe
[index_frontend
]->dtv_property_cache
.delivery_system
= SYS_DVBT
;
1933 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_HIGH_Z
);
1935 dib9000_set_channel_status(state
->fe
[index_frontend
], &state
->channel_status
);
1936 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
1940 exit_condition
= 0; /* 0: tune pending; 1: tune failed; 2:tune success */
1941 index_frontend_success
= 0;
1943 sleep_time
= dib9000_fw_tune(state
->fe
[0], NULL
);
1944 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1945 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
], NULL
);
1946 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
1947 sleep_time
= sleep_time_slave
;
1948 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
1949 sleep_time
= sleep_time_slave
;
1951 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
1952 msleep(sleep_time
/ 10);
1958 index_frontend_success
= 0;
1959 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1960 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
1961 if (frontend_status
> -FE_STATUS_TUNE_PENDING
) {
1962 exit_condition
= 2; /* tune success */
1963 index_frontend_success
= index_frontend
;
1966 if (frontend_status
== -FE_STATUS_TUNE_PENDING
)
1967 nbr_pending
++; /* some frontends are still tuning */
1969 if ((exit_condition
!= 2) && (nbr_pending
== 0))
1970 exit_condition
= 1; /* if all tune are done and no success, exit: tune failed */
1972 } while (exit_condition
== 0);
1974 /* check the tune result */
1975 if (exit_condition
== 1) { /* tune failed */
1976 dprintk("tune failed");
1980 dprintk("tune success on frontend%i", index_frontend_success
);
1982 /* synchronize all the channel cache */
1983 dib9000_get_frontend(state
->fe
[0], fep
);
1985 /* retune the other frontends with the found channel */
1986 channel_status
.status
= CHANNEL_STATUS_PARAMETERS_SET
;
1987 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1988 /* only retune the frontends which was not tuned success */
1989 if (index_frontend
!= index_frontend_success
) {
1990 dib9000_set_channel_status(state
->fe
[index_frontend
], &channel_status
);
1991 dib9000_set_tune_state(state
->fe
[index_frontend
], CT_DEMOD_START
);
1995 sleep_time
= FE_CALLBACK_TIME_NEVER
;
1996 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
1997 if (index_frontend
!= index_frontend_success
) {
1998 sleep_time_slave
= dib9000_fw_tune(state
->fe
[index_frontend
], NULL
);
1999 if (sleep_time
== FE_CALLBACK_TIME_NEVER
)
2000 sleep_time
= sleep_time_slave
;
2001 else if ((sleep_time_slave
!= FE_CALLBACK_TIME_NEVER
) && (sleep_time_slave
> sleep_time
))
2002 sleep_time
= sleep_time_slave
;
2005 if (sleep_time
!= FE_CALLBACK_TIME_NEVER
)
2006 msleep(sleep_time
/ 10);
2011 for (index_frontend
= 0; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2012 if (index_frontend
!= index_frontend_success
) {
2013 frontend_status
= -dib9000_get_status(state
->fe
[index_frontend
]);
2014 if ((index_frontend
!= index_frontend_success
) && (frontend_status
== -FE_STATUS_TUNE_PENDING
))
2015 nbr_pending
++; /* some frontends are still tuning */
2018 } while (nbr_pending
!= 0);
2020 /* set the output mode */
2021 dib9000_fw_set_output_mode(state
->fe
[0], state
->chip
.d9
.cfg
.output_mode
);
2022 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2023 dib9000_fw_set_output_mode(state
->fe
[index_frontend
], OUTMODE_DIVERSITY
);
2025 /* turn off the diversity for the last frontend */
2026 dib9000_fw_set_diversity_in(state
->fe
[index_frontend
- 1], 0);
2031 static u16
dib9000_read_lock(struct dvb_frontend
*fe
)
2033 struct dib9000_state
*state
= fe
->demodulator_priv
;
2035 return dib9000_read_word(state
, 535);
2038 static int dib9000_read_status(struct dvb_frontend
*fe
, fe_status_t
* stat
)
2040 struct dib9000_state
*state
= fe
->demodulator_priv
;
2042 u16 lock
= 0, lock_slave
= 0;
2044 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2045 lock_slave
|= dib9000_read_lock(state
->fe
[index_frontend
]);
2047 lock
= dib9000_read_word(state
, 535);
2051 if ((lock
& 0x8000) || (lock_slave
& 0x8000))
2052 *stat
|= FE_HAS_SIGNAL
;
2053 if ((lock
& 0x3000) || (lock_slave
& 0x3000))
2054 *stat
|= FE_HAS_CARRIER
;
2055 if ((lock
& 0x0100) || (lock_slave
& 0x0100))
2056 *stat
|= FE_HAS_VITERBI
;
2057 if (((lock
& 0x0038) == 0x38) || ((lock_slave
& 0x0038) == 0x38))
2058 *stat
|= FE_HAS_SYNC
;
2059 if ((lock
& 0x0008) || (lock_slave
& 0x0008))
2060 *stat
|= FE_HAS_LOCK
;
2065 static int dib9000_read_ber(struct dvb_frontend
*fe
, u32
* ber
)
2067 struct dib9000_state
*state
= fe
->demodulator_priv
;
2070 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2071 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0)
2073 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
,
2074 state
->i2c_read_buffer
, 16 * 2);
2075 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2077 c
= (u16
*)state
->i2c_read_buffer
;
2079 *ber
= c
[10] << 16 | c
[11];
2083 static int dib9000_read_signal_strength(struct dvb_frontend
*fe
, u16
* strength
)
2085 struct dib9000_state
*state
= fe
->demodulator_priv
;
2087 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2091 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++) {
2092 state
->fe
[index_frontend
]->ops
.read_signal_strength(state
->fe
[index_frontend
], &val
);
2093 if (val
> 65535 - *strength
)
2099 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2100 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0)
2102 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2103 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2106 if (val
> 65535 - *strength
)
2113 static u32
dib9000_get_snr(struct dvb_frontend
*fe
)
2115 struct dib9000_state
*state
= fe
->demodulator_priv
;
2116 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2120 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2121 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0)
2123 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2124 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2127 n
= (val
>> 4) & 0xff;
2128 exp
= ((val
& 0xf) << 2);
2130 exp
+= ((val
>> 14) & 0x3);
2131 if ((exp
& 0x20) != 0)
2135 s
= (val
>> 6) & 0xFF;
2137 if ((exp
& 0x20) != 0)
2142 u32 t
= (s
/ n
) << 16;
2143 return t
+ ((s
<< 16) - n
* t
) / n
;
2148 static int dib9000_read_snr(struct dvb_frontend
*fe
, u16
* snr
)
2150 struct dib9000_state
*state
= fe
->demodulator_priv
;
2154 snr_master
= dib9000_get_snr(fe
);
2155 for (index_frontend
= 1; (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
); index_frontend
++)
2156 snr_master
+= dib9000_get_snr(state
->fe
[index_frontend
]);
2158 if ((snr_master
>> 16) != 0) {
2159 snr_master
= 10 * intlog10(snr_master
>> 16);
2160 *snr
= snr_master
/ ((1 << 24) / 10);
2167 static int dib9000_read_unc_blocks(struct dvb_frontend
*fe
, u32
* unc
)
2169 struct dib9000_state
*state
= fe
->demodulator_priv
;
2170 u16
*c
= (u16
*)state
->i2c_read_buffer
;
2172 DibAcquireLock(&state
->platform
.risc
.mem_mbx_lock
);
2173 if (dib9000_fw_memmbx_sync(state
, FE_SYNC_CHANNEL
) < 0)
2175 dib9000_risc_mem_read(state
, FE_MM_R_FE_MONITOR
, (u8
*) c
, 16 * 2);
2176 DibReleaseLock(&state
->platform
.risc
.mem_mbx_lock
);
2182 int dib9000_i2c_enumeration(struct i2c_adapter
*i2c
, int no_of_demods
, u8 default_addr
, u8 first_addr
)
2186 struct i2c_device client
= {.i2c_adap
= i2c
};
2188 client
.i2c_write_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2189 if (!client
.i2c_write_buffer
) {
2190 dprintk("%s: not enough memory", __func__
);
2193 client
.i2c_read_buffer
= kzalloc(4 * sizeof(u8
), GFP_KERNEL
);
2194 if (!client
.i2c_read_buffer
) {
2195 dprintk("%s: not enough memory", __func__
);
2200 client
.i2c_addr
= default_addr
+ 16;
2201 dib9000_i2c_write16(&client
, 1796, 0x0);
2203 for (k
= no_of_demods
- 1; k
>= 0; k
--) {
2204 /* designated i2c address */
2205 new_addr
= first_addr
+ (k
<< 1);
2206 client
.i2c_addr
= default_addr
;
2208 dib9000_i2c_write16(&client
, 1817, 3);
2209 dib9000_i2c_write16(&client
, 1796, 0);
2210 dib9000_i2c_write16(&client
, 1227, 1);
2211 dib9000_i2c_write16(&client
, 1227, 0);
2213 client
.i2c_addr
= new_addr
;
2214 dib9000_i2c_write16(&client
, 1817, 3);
2215 dib9000_i2c_write16(&client
, 1796, 0);
2216 dib9000_i2c_write16(&client
, 1227, 1);
2217 dib9000_i2c_write16(&client
, 1227, 0);
2219 if (dib9000_identify(&client
) == 0) {
2220 client
.i2c_addr
= default_addr
;
2221 if (dib9000_identify(&client
) == 0) {
2222 dprintk("DiB9000 #%d: not identified", k
);
2228 dib9000_i2c_write16(&client
, 1795, (1 << 10) | (4 << 6));
2229 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2) | 2);
2231 dprintk("IC %d initialized (to i2c_address 0x%x)", k
, new_addr
);
2234 for (k
= 0; k
< no_of_demods
; k
++) {
2235 new_addr
= first_addr
| (k
<< 1);
2236 client
.i2c_addr
= new_addr
;
2238 dib9000_i2c_write16(&client
, 1794, (new_addr
<< 2));
2239 dib9000_i2c_write16(&client
, 1795, 0);
2243 kfree(client
.i2c_read_buffer
);
2245 kfree(client
.i2c_write_buffer
);
2249 EXPORT_SYMBOL(dib9000_i2c_enumeration
);
2251 int dib9000_set_slave_frontend(struct dvb_frontend
*fe
, struct dvb_frontend
*fe_slave
)
2253 struct dib9000_state
*state
= fe
->demodulator_priv
;
2254 u8 index_frontend
= 1;
2256 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2258 if (index_frontend
< MAX_NUMBER_OF_FRONTENDS
) {
2259 dprintk("set slave fe %p to index %i", fe_slave
, index_frontend
);
2260 state
->fe
[index_frontend
] = fe_slave
;
2264 dprintk("too many slave frontend");
2267 EXPORT_SYMBOL(dib9000_set_slave_frontend
);
2269 int dib9000_remove_slave_frontend(struct dvb_frontend
*fe
)
2271 struct dib9000_state
*state
= fe
->demodulator_priv
;
2272 u8 index_frontend
= 1;
2274 while ((index_frontend
< MAX_NUMBER_OF_FRONTENDS
) && (state
->fe
[index_frontend
] != NULL
))
2276 if (index_frontend
!= 1) {
2277 dprintk("remove slave fe %p (index %i)", state
->fe
[index_frontend
- 1], index_frontend
- 1);
2278 state
->fe
[index_frontend
] = NULL
;
2282 dprintk("no frontend to be removed");
2285 EXPORT_SYMBOL(dib9000_remove_slave_frontend
);
2287 struct dvb_frontend
*dib9000_get_slave_frontend(struct dvb_frontend
*fe
, int slave_index
)
2289 struct dib9000_state
*state
= fe
->demodulator_priv
;
2291 if (slave_index
>= MAX_NUMBER_OF_FRONTENDS
)
2293 return state
->fe
[slave_index
];
2295 EXPORT_SYMBOL(dib9000_get_slave_frontend
);
2297 static struct dvb_frontend_ops dib9000_ops
;
2298 struct dvb_frontend
*dib9000_attach(struct i2c_adapter
*i2c_adap
, u8 i2c_addr
, const struct dib9000_config
*cfg
)
2300 struct dvb_frontend
*fe
;
2301 struct dib9000_state
*st
;
2302 st
= kzalloc(sizeof(struct dib9000_state
), GFP_KERNEL
);
2305 fe
= kzalloc(sizeof(struct dvb_frontend
), GFP_KERNEL
);
2311 memcpy(&st
->chip
.d9
.cfg
, cfg
, sizeof(struct dib9000_config
));
2312 st
->i2c
.i2c_adap
= i2c_adap
;
2313 st
->i2c
.i2c_addr
= i2c_addr
;
2314 st
->i2c
.i2c_write_buffer
= st
->i2c_write_buffer
;
2315 st
->i2c
.i2c_read_buffer
= st
->i2c_read_buffer
;
2317 st
->gpio_dir
= DIB9000_GPIO_DEFAULT_DIRECTIONS
;
2318 st
->gpio_val
= DIB9000_GPIO_DEFAULT_VALUES
;
2319 st
->gpio_pwm_pos
= DIB9000_GPIO_DEFAULT_PWM_POS
;
2321 DibInitLock(&st
->platform
.risc
.mbx_if_lock
);
2322 DibInitLock(&st
->platform
.risc
.mbx_lock
);
2323 DibInitLock(&st
->platform
.risc
.mem_lock
);
2324 DibInitLock(&st
->platform
.risc
.mem_mbx_lock
);
2327 fe
->demodulator_priv
= st
;
2328 memcpy(&st
->fe
[0]->ops
, &dib9000_ops
, sizeof(struct dvb_frontend_ops
));
2330 /* Ensure the output mode remains at the previous default if it's
2331 * not specifically set by the caller.
2333 if ((st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_SERIAL
) && (st
->chip
.d9
.cfg
.output_mode
!= OUTMODE_MPEG2_PAR_GATED_CLK
))
2334 st
->chip
.d9
.cfg
.output_mode
= OUTMODE_MPEG2_FIFO
;
2336 if (dib9000_identify(&st
->i2c
) == 0)
2339 dibx000_init_i2c_master(&st
->i2c_master
, DIB7000MC
, st
->i2c
.i2c_adap
, st
->i2c
.i2c_addr
);
2341 st
->tuner_adap
.dev
.parent
= i2c_adap
->dev
.parent
;
2342 strncpy(st
->tuner_adap
.name
, "DIB9000_FW TUNER ACCESS", sizeof(st
->tuner_adap
.name
));
2343 st
->tuner_adap
.algo
= &dib9000_tuner_algo
;
2344 st
->tuner_adap
.algo_data
= NULL
;
2345 i2c_set_adapdata(&st
->tuner_adap
, st
);
2346 if (i2c_add_adapter(&st
->tuner_adap
) < 0)
2349 st
->component_bus
.dev
.parent
= i2c_adap
->dev
.parent
;
2350 strncpy(st
->component_bus
.name
, "DIB9000_FW COMPONENT BUS ACCESS", sizeof(st
->component_bus
.name
));
2351 st
->component_bus
.algo
= &dib9000_component_bus_algo
;
2352 st
->component_bus
.algo_data
= NULL
;
2353 st
->component_bus_speed
= 340;
2354 i2c_set_adapdata(&st
->component_bus
, st
);
2355 if (i2c_add_adapter(&st
->component_bus
) < 0)
2356 goto component_bus_add_error
;
2358 dib9000_fw_reset(fe
);
2362 component_bus_add_error
:
2363 i2c_del_adapter(&st
->tuner_adap
);
2368 EXPORT_SYMBOL(dib9000_attach
);
2370 static struct dvb_frontend_ops dib9000_ops
= {
2372 .name
= "DiBcom 9000",
2374 .frequency_min
= 44250000,
2375 .frequency_max
= 867250000,
2376 .frequency_stepsize
= 62500,
2377 .caps
= FE_CAN_INVERSION_AUTO
|
2378 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
2379 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
2380 FE_CAN_QPSK
| FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
2381 FE_CAN_TRANSMISSION_MODE_AUTO
| FE_CAN_GUARD_INTERVAL_AUTO
| FE_CAN_RECOVER
| FE_CAN_HIERARCHY_AUTO
,
2384 .release
= dib9000_release
,
2386 .init
= dib9000_wakeup
,
2387 .sleep
= dib9000_sleep
,
2389 .set_frontend
= dib9000_set_frontend
,
2390 .get_tune_settings
= dib9000_fe_get_tune_settings
,
2391 .get_frontend
= dib9000_get_frontend
,
2393 .read_status
= dib9000_read_status
,
2394 .read_ber
= dib9000_read_ber
,
2395 .read_signal_strength
= dib9000_read_signal_strength
,
2396 .read_snr
= dib9000_read_snr
,
2397 .read_ucblocks
= dib9000_read_unc_blocks
,
2400 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
2401 MODULE_AUTHOR("Olivier Grenie <ogrenie@dibcom.fr>");
2402 MODULE_DESCRIPTION("Driver for the DiBcom 9000 COFDM demodulator");
2403 MODULE_LICENSE("GPL");