Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 76525
b: refs/heads/master
c: b5f3e1e
h: refs/heads/master
i:
  76523: ccafb18
v: v3
  • Loading branch information
Michael Krufky authored and Mauro Carvalho Chehab committed Jan 25, 2008
1 parent ced1d23 commit 0368c56
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 123 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aaeccba68a60eedee5fe90f9e1478367b1f97345
refs/heads/master: b5f3e1e153b60f7bc338cdd6eefacd59c2dfb375
119 changes: 25 additions & 94 deletions trunk/drivers/media/dvb/frontends/tda18271-fe.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,10 @@
#include "tda18271.h"
#include "tda18271-priv.h"

static int tda18271_debug;
int tda18271_debug;
module_param_named(debug, tda18271_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debug level (info=1, map=2, reg=4 (or-able))");

#define dprintk(level, fmt, arg...) do {\
if (tda18271_debug & level) \
printk(KERN_DEBUG "%s: " fmt, __FUNCTION__, ##arg); } while (0)

#define DBG_INFO 1
#define DBG_MAP 2
#define DBG_REG 4

#define dbg_info(fmt, arg...) dprintk(DBG_INFO, fmt, ##arg)
#define dbg_map(fmt, arg...) dprintk(DBG_MAP, fmt, ##arg)
#define dbg_reg(fmt, arg...) dprintk(DBG_REG, fmt, ##arg)

/*---------------------------------------------------------------------*/

#define TDA18271_ANALOG 0
Expand Down Expand Up @@ -365,7 +353,7 @@ static int tda18271_tune(struct dvb_frontend *fe,
struct tda18271_priv *priv = fe->tuner_priv;
unsigned char *regs = priv->tda18271_regs;
u32 div, N = 0;
int i;
u8 d, pd, val;

tda18271_init(fe);

Expand All @@ -374,16 +362,10 @@ static int tda18271_tune(struct dvb_frontend *fe,
/* RF tracking filter calibration */

/* calculate BP_Filter */
i = 0;
while ((tda18271_bp_filter[i].rfmax * 1000) < freq) {
if (tda18271_bp_filter[i + 1].rfmax == 0)
break;
i++;
}
dbg_map("bp filter = 0x%x, i = %d\n", tda18271_bp_filter[i].val, i);
tda18271_calc_bp_filter(&freq, &val);

regs[R_EP1] &= ~0x07; /* clear bp filter bits */
regs[R_EP1] |= tda18271_bp_filter[i].val;
regs[R_EP1] |= val;
tda18271_write_regs(fe, R_EP1, 1);

regs[R_EB4] &= 0x07;
Expand Down Expand Up @@ -413,18 +395,11 @@ static int tda18271_tune(struct dvb_frontend *fe,
break;
}

i = 0;
while ((tda18271_cal_pll[i].lomax * 1000) < N) {
if (tda18271_cal_pll[i + 1].lomax == 0)
break;
i++;
}
dbg_map("cal pll, pd = 0x%x, d = 0x%x, i = %d\n",
tda18271_cal_pll[i].pd, tda18271_cal_pll[i].d, i);
tda18271_calc_cal_pll(&N, &pd, &d);

regs[R_CPD] = tda18271_cal_pll[i].pd;
regs[R_CPD] = pd;

div = ((tda18271_cal_pll[i].d * (N / 1000)) << 7) / 125;
div = ((d * (N / 1000)) << 7) / 125;
regs[R_CD1] = 0xff & (div >> 16);
regs[R_CD2] = 0xff & (div >> 8);
regs[R_CD3] = 0xff & div;
Expand All @@ -440,16 +415,9 @@ static int tda18271_tune(struct dvb_frontend *fe,
break;
}

i = 0;
while ((tda18271_main_pll[i].lomax * 1000) < N) {
if (tda18271_main_pll[i + 1].lomax == 0)
break;
i++;
}
dbg_map("main pll, pd = 0x%x, d = 0x%x, i = %d\n",
tda18271_main_pll[i].pd, tda18271_main_pll[i].d, i);
tda18271_calc_main_pll(&N, &pd, &d);

regs[R_MPD] = (0x7f & tda18271_main_pll[i].pd);
regs[R_MPD] = (0x7f & pd);

switch (priv->mode) {
case TDA18271_ANALOG:
Expand All @@ -460,7 +428,7 @@ static int tda18271_tune(struct dvb_frontend *fe,
break;
}

div = ((tda18271_main_pll[i].d * (N / 1000)) << 7) / 125;
div = ((d * (N / 1000)) << 7) / 125;
regs[R_MD1] = 0xff & (div >> 16);
regs[R_MD2] = 0xff & (div >> 8);
regs[R_MD3] = 0xff & div;
Expand All @@ -469,42 +437,23 @@ static int tda18271_tune(struct dvb_frontend *fe,
msleep(5); /* RF tracking filter calibration initialization */

/* search for K,M,CO for RF Calibration */
i = 0;
while ((tda18271_km[i].rfmax * 1000) < freq) {
if (tda18271_km[i + 1].rfmax == 0)
break;
i++;
}
dbg_map("km = 0x%x, i = %d\n", tda18271_km[i].val, i);
tda18271_calc_km(&freq, &val);

regs[R_EB13] &= 0x83;
regs[R_EB13] |= tda18271_km[i].val;
regs[R_EB13] |= val;
tda18271_write_regs(fe, R_EB13, 1);

/* search for RF_BAND */
i = 0;
while ((tda18271_rf_band[i].rfmax * 1000) < freq) {
if (tda18271_rf_band[i + 1].rfmax == 0)
break;
i++;
}
dbg_map("rf band = 0x%x, i = %d\n", tda18271_rf_band[i].val, i);
tda18271_calc_rf_band(&freq, &val);

regs[R_EP2] &= ~0xe0; /* clear rf band bits */
regs[R_EP2] |= (tda18271_rf_band[i].val << 5);
regs[R_EP2] |= (val << 5);

/* search for Gain_Taper */
i = 0;
while ((tda18271_gain_taper[i].rfmax * 1000) < freq) {
if (tda18271_gain_taper[i + 1].rfmax == 0)
break;
i++;
}
dbg_map("gain taper = 0x%x, i = %d\n",
tda18271_gain_taper[i].val, i);
tda18271_calc_gain_taper(&freq, &val);

regs[R_EP2] &= ~0x1f; /* clear gain taper bits */
regs[R_EP2] |= tda18271_gain_taper[i].val;
regs[R_EP2] |= val;

tda18271_write_regs(fe, R_EP2, 1);
tda18271_write_regs(fe, R_EP1, 1);
Expand All @@ -529,17 +478,11 @@ static int tda18271_tune(struct dvb_frontend *fe,
tda18271_write_regs(fe, R_EP1, 1);

/* RF tracking filer correction for VHF_Low band */
i = 0;
while ((tda18271_rf_cal[i].rfmax * 1000) < freq) {
if (tda18271_rf_cal[i].rfmax == 0)
break;
i++;
}
dbg_map("rf cal = 0x%x, i = %d\n", tda18271_rf_cal[i].val, i);
tda18271_calc_rf_cal(&freq, &val);

/* VHF_Low band only */
if (tda18271_rf_cal[i].rfmax != 0) {
regs[R_EB14] = tda18271_rf_cal[i].val;
if (val != 0) {
regs[R_EB14] = val;
tda18271_write_regs(fe, R_EB14, 1);
}

Expand Down Expand Up @@ -579,29 +522,17 @@ static int tda18271_tune(struct dvb_frontend *fe,
regs[R_EP4] &= ~0x80; /* turn this bit on only for fm */

/* image rejection validity EP5[2:0] */
i = 0;
while ((tda18271_ir_measure[i].rfmax * 1000) < freq) {
if (tda18271_ir_measure[i].rfmax == 0)
break;
i++;
}
dbg_map("ir measure, i = %d\n", i);
tda18271_calc_ir_measure(&freq, &val);

regs[R_EP5] &= ~0x07;
regs[R_EP5] |= tda18271_ir_measure[i].val;
regs[R_EP5] |= val;

/* calculate MAIN PLL */
N = freq + ifc;

i = 0;
while ((tda18271_main_pll[i].lomax * 1000) < N) {
if (tda18271_main_pll[i + 1].lomax == 0)
break;
i++;
}
dbg_map("main pll, pd = 0x%x, d = 0x%x, i = %d\n",
tda18271_main_pll[i].pd, tda18271_main_pll[i].d, i);
tda18271_calc_main_pll(&N, &pd, &d);

regs[R_MPD] = (0x7f & tda18271_main_pll[i].pd);
regs[R_MPD] = (0x7f & pd);
switch (priv->mode) {
case TDA18271_ANALOG:
regs[R_MPD] &= ~0x08;
Expand All @@ -611,7 +542,7 @@ static int tda18271_tune(struct dvb_frontend *fe,
break;
}

div = ((tda18271_main_pll[i].d * (N / 1000)) << 7) / 125;
div = ((d * (N / 1000)) << 7) / 125;
regs[R_MD1] = 0xff & (div >> 16);
regs[R_MD2] = 0xff & (div >> 8);
regs[R_MD3] = 0xff & div;
Expand Down
46 changes: 26 additions & 20 deletions trunk/drivers/media/dvb/frontends/tda18271-priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#ifndef __TDA18271_PRIV_H__
#define __TDA18271_PRIV_H__

#include <linux/kernel.h>
#include <linux/types.h>

#define R_ID 0x00 /* ID byte */
Expand Down Expand Up @@ -65,26 +66,31 @@

#define TDA18271_NUM_REGS 39

struct tda18271_pll_map {
u32 lomax;
u8 pd; /* post div */
u8 d; /* div */
};

extern struct tda18271_pll_map tda18271_main_pll[];
extern struct tda18271_pll_map tda18271_cal_pll[];

struct tda18271_map {
u32 rfmax;
u8 val;
};

extern struct tda18271_map tda18271_bp_filter[];
extern struct tda18271_map tda18271_km[];
extern struct tda18271_map tda18271_rf_band[];
extern struct tda18271_map tda18271_gain_taper[];
extern struct tda18271_map tda18271_rf_cal[];
extern struct tda18271_map tda18271_ir_measure[];
extern int tda18271_debug;

#define dprintk(level, fmt, arg...) do {\
if (tda18271_debug & level) \
printk(KERN_DEBUG "%s: " fmt, __FUNCTION__, ##arg); } while (0)

#define DBG_INFO 1
#define DBG_MAP 2
#define DBG_REG 4

#define dbg_info(fmt, arg...) dprintk(DBG_INFO, fmt, ##arg)
#define dbg_map(fmt, arg...) dprintk(DBG_MAP, fmt, ##arg)
#define dbg_reg(fmt, arg...) dprintk(DBG_REG, fmt, ##arg)

/*---------------------------------------------------------------------*/

extern void tda18271_calc_cal_pll(u32 *freq, u8 *post_div, u8 *div);
extern void tda18271_calc_main_pll(u32 *freq, u8 *post_div, u8 *div);

extern void tda18271_calc_bp_filter(u32 *freq, u8 *val);
extern void tda18271_calc_km(u32 *freq, u8 *val);
extern void tda18271_calc_rf_band(u32 *freq, u8 *val);
extern void tda18271_calc_gain_taper(u32 *freq, u8 *val);
extern void tda18271_calc_rf_cal(u32 *freq, u8 *val);
extern void tda18271_calc_ir_measure(u32 *freq, u8 *val);

#endif /* __TDA18271_PRIV_H__ */

Expand Down
Loading

0 comments on commit 0368c56

Please sign in to comment.