Commit 8385e46f authored by Johannes Stezenbach's avatar Johannes Stezenbach Committed by Linus Torvalds

[PATCH] dvb: DST: fixed tuning problem

fixed a tuning problem for cards based on the old firmware (Steffen Motzer,
Manu Abraham)
Signed-off-by: default avatarJohannes Stezenbach <js@linuxtv.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e6ac699a
...@@ -81,9 +81,7 @@ int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int ...@@ -81,9 +81,7 @@ int dst_gpio_outb(struct dst_state* state, u32 mask, u32 enbb, u32 outhigh, int
dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb); dprintk("%s: dst_gpio_enb error (err == %i, mask == %02x, enb == %02x)\n", __FUNCTION__, err, mask, enbb);
return -EREMOTEIO; return -EREMOTEIO;
} }
udelay(1000);
msleep(1);
/* because complete disabling means no output, no need to do output packet */ /* because complete disabling means no output, no need to do output packet */
if (enbb == 0) if (enbb == 0)
return 0; return 0;
...@@ -150,8 +148,7 @@ int rdc_8820_reset(struct dst_state *state) ...@@ -150,8 +148,7 @@ int rdc_8820_reset(struct dst_state *state)
dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
return -1; return -1;
} }
msleep(1); udelay(1000);
if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) { if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) {
dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
return -1; return -1;
...@@ -167,8 +164,7 @@ int dst_pio_enable(struct dst_state *state) ...@@ -167,8 +164,7 @@ int dst_pio_enable(struct dst_state *state)
dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
return -1; return -1;
} }
msleep(1); udelay(1000);
return 0; return 0;
} }
EXPORT_SYMBOL(dst_pio_enable); EXPORT_SYMBOL(dst_pio_enable);
...@@ -179,6 +175,8 @@ int dst_pio_disable(struct dst_state *state) ...@@ -179,6 +175,8 @@ int dst_pio_disable(struct dst_state *state)
dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__); dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
return -1; return -1;
} }
if (state->type_flags & DST_TYPE_HAS_FW_1)
udelay(1000);
return 0; return 0;
} }
...@@ -200,7 +198,7 @@ int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode) ...@@ -200,7 +198,7 @@ int dst_wait_dst_ready(struct dst_state *state, u8 delay_mode)
dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i); dprintk("%s: dst wait ready after %d\n", __FUNCTION__, i);
return 1; return 1;
} }
msleep(1); msleep(35);
} }
if (verbose > 1) if (verbose > 1)
dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i); dprintk("%s: dst wait NOT ready after %d\n", __FUNCTION__, i);
...@@ -245,6 +243,11 @@ int dst_comm_init(struct dst_state* state) ...@@ -245,6 +243,11 @@ int dst_comm_init(struct dst_state* state)
dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__); dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__);
return -1; return -1;
} }
if (state->type_flags & DST_TYPE_HAS_FW_1)
msleep(100);
else
msleep(5);
return 0; return 0;
} }
EXPORT_SYMBOL(dst_comm_init); EXPORT_SYMBOL(dst_comm_init);
...@@ -328,8 +331,9 @@ static int dst_set_freq(struct dst_state *state, u32 freq) ...@@ -328,8 +331,9 @@ static int dst_set_freq(struct dst_state *state, u32 freq)
u8 *val; u8 *val;
state->frequency = freq; state->frequency = freq;
if (debug > 4)
dprintk("%s: set Frequency %u\n", __FUNCTION__, freq);
// dprintk("%s: set frequency %u\n", __FUNCTION__, freq);
if (state->dst_type == DST_TYPE_IS_SAT) { if (state->dst_type == DST_TYPE_IS_SAT) {
freq = freq / 1000; freq = freq / 1000;
if (freq < 950 || freq > 2150) if (freq < 950 || freq > 2150)
...@@ -452,7 +456,8 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate) ...@@ -452,7 +456,8 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate)
if (state->dst_type == DST_TYPE_IS_TERR) { if (state->dst_type == DST_TYPE_IS_TERR) {
return 0; return 0;
} }
// dprintk("%s: set srate %u\n", __FUNCTION__, srate); if (debug > 4)
dprintk("%s: set symrate %u\n", __FUNCTION__, srate);
srate /= 1000; srate /= 1000;
val = &state->tx_tuna[0]; val = &state->tx_tuna[0];
...@@ -461,7 +466,10 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate) ...@@ -461,7 +466,10 @@ static int dst_set_symbolrate(struct dst_state* state, u32 srate)
sval <<= 20; sval <<= 20;
do_div(sval, 88000); do_div(sval, 88000);
symcalc = (u32) sval; symcalc = (u32) sval;
// dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
if (debug > 4)
dprintk("%s: set symcalc %u\n", __FUNCTION__, symcalc);
val[5] = (u8) (symcalc >> 12); val[5] = (u8) (symcalc >> 12);
val[6] = (u8) (symcalc >> 4); val[6] = (u8) (symcalc >> 4);
val[7] = (u8) (symcalc << 4); val[7] = (u8) (symcalc << 4);
...@@ -504,6 +512,7 @@ static void dst_type_flags_print(u32 type_flags) ...@@ -504,6 +512,7 @@ static void dst_type_flags_print(u32 type_flags)
printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2); printk(" 0x%x firmware version = 2", DST_TYPE_HAS_FW_2);
if (type_flags & DST_TYPE_HAS_FW_3) if (type_flags & DST_TYPE_HAS_FW_3)
printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3); printk(" 0x%x firmware version = 3", DST_TYPE_HAS_FW_3);
// if ((type_flags & DST_TYPE_HAS_FW_BUILD) && new_fw)
printk("\n"); printk("\n");
} }
...@@ -617,13 +626,13 @@ struct dst_types dst_tlist[] = { ...@@ -617,13 +626,13 @@ struct dst_types dst_tlist[] = {
.dst_type = DST_TYPE_IS_SAT, .dst_type = DST_TYPE_IS_SAT,
.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1, .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1,
.dst_feature = DST_TYPE_HAS_CA .dst_feature = DST_TYPE_HAS_CA
}, /* unknown to vendor */ }, /* An OEM board */
{ {
.device_id = "DSTMCI", .device_id = "DSTMCI",
.offset = 1, .offset = 1,
.dst_type = DST_TYPE_IS_SAT, .dst_type = DST_TYPE_IS_SAT,
.type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2, .type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
.dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 .dst_feature = DST_TYPE_HAS_CA | DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4
| DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC | DST_TYPE_HAS_MOTO | DST_TYPE_HAS_MAC
}, },
...@@ -640,7 +649,8 @@ struct dst_types dst_tlist[] = { ...@@ -640,7 +649,8 @@ struct dst_types dst_tlist[] = {
.device_id = "DCT-CI", .device_id = "DCT-CI",
.offset = 1, .offset = 1,
.dst_type = DST_TYPE_IS_CABLE, .dst_type = DST_TYPE_IS_CABLE,
.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1 | DST_TYPE_HAS_FW_2, .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_1
| DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
.dst_feature = DST_TYPE_HAS_CA .dst_feature = DST_TYPE_HAS_CA
}, },
...@@ -656,7 +666,7 @@ struct dst_types dst_tlist[] = { ...@@ -656,7 +666,7 @@ struct dst_types dst_tlist[] = {
.device_id = "DTT-CI", .device_id = "DTT-CI",
.offset = 1, .offset = 1,
.dst_type = DST_TYPE_IS_TERR, .dst_type = DST_TYPE_IS_TERR,
.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2, .type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_FW_2 | DST_TYPE_HAS_FW_BUILD,
.dst_feature = 0 .dst_feature = 0
}, },
...@@ -782,7 +792,7 @@ static int dst_probe(struct dst_state *state) ...@@ -782,7 +792,7 @@ static int dst_probe(struct dst_state *state)
dprintk("%s: DST Initialization Failed.\n", __FUNCTION__); dprintk("%s: DST Initialization Failed.\n", __FUNCTION__);
return -1; return -1;
} }
msleep(100);
if (dst_get_device_id(state) < 0) { if (dst_get_device_id(state) < 0) {
dprintk("%s: unknown device.\n", __FUNCTION__); dprintk("%s: unknown device.\n", __FUNCTION__);
return -1; return -1;
...@@ -812,6 +822,8 @@ int dst_command(struct dst_state* state, u8 * data, u8 len) ...@@ -812,6 +822,8 @@ int dst_command(struct dst_state* state, u8 * data, u8 len)
dprintk("%s: PIO Disable Failed.\n", __FUNCTION__); dprintk("%s: PIO Disable Failed.\n", __FUNCTION__);
return -1; return -1;
} }
if (state->type_flags & DST_TYPE_HAS_FW_1)
udelay(3000);
if (read_dst(state, &reply, GET_ACK)) { if (read_dst(state, &reply, GET_ACK)) {
if (verbose > 1) if (verbose > 1)
...@@ -829,6 +841,13 @@ int dst_command(struct dst_state* state, u8 * data, u8 len) ...@@ -829,6 +841,13 @@ int dst_command(struct dst_state* state, u8 * data, u8 len)
} }
if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3)) if (len >= 2 && data[0] == 0 && (data[1] == 1 || data[1] == 3))
return 0; return 0;
// udelay(3000);
if (state->type_flags & DST_TYPE_HAS_FW_1)
udelay(3000);
else
udelay(2000);
if (!dst_wait_dst_ready(state, NO_DELAY)) if (!dst_wait_dst_ready(state, NO_DELAY))
return -1; return -1;
...@@ -919,8 +938,6 @@ static int dst_get_tuna(struct dst_state* state) ...@@ -919,8 +938,6 @@ static int dst_get_tuna(struct dst_state* state)
if (!dst_wait_dst_ready(state, NO_DELAY)) if (!dst_wait_dst_ready(state, NO_DELAY))
return 0; return 0;
msleep(10);
if (state->type_flags & DST_TYPE_HAS_NEWTUNE) { if (state->type_flags & DST_TYPE_HAS_NEWTUNE) {
/* how to get variable length reply ???? */ /* how to get variable length reply ???? */
retval = read_dst(state, state->rx_tuna, 10); retval = read_dst(state, state->rx_tuna, 10);
...@@ -969,7 +986,9 @@ static int dst_write_tuna(struct dvb_frontend* fe) ...@@ -969,7 +986,9 @@ static int dst_write_tuna(struct dvb_frontend* fe)
int retval; int retval;
u8 reply; u8 reply;
if (debug > 4)
dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags); dprintk("%s: type_flags 0x%x \n", __FUNCTION__, state->type_flags);
state->decode_freq = 0; state->decode_freq = 0;
state->decode_lock = state->decode_strength = state->decode_snr = 0; state->decode_lock = state->decode_strength = state->decode_snr = 0;
if (state->dst_type == DST_TYPE_IS_SAT) { if (state->dst_type == DST_TYPE_IS_SAT) {
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#define DST_TYPE_HAS_FW_1 8 #define DST_TYPE_HAS_FW_1 8
#define DST_TYPE_HAS_FW_2 16 #define DST_TYPE_HAS_FW_2 16
#define DST_TYPE_HAS_FW_3 32 #define DST_TYPE_HAS_FW_3 32
#define DST_TYPE_HAS_FW_BUILD 64
/* Card capability list */ /* Card capability list */
...@@ -117,8 +117,8 @@ struct dst_types { ...@@ -117,8 +117,8 @@ struct dst_types {
char *device_id; char *device_id;
int offset; int offset;
u8 dst_type; u8 dst_type;
u32 type_flags; u64 type_flags;
u8 dst_feature; u64 dst_feature;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment