V4L/DVB (6006): tuner: move last_div to tuner-simple private data

tuner-simple is the only sub-driver that uses last_div, so we 
can free up two bytes of memory for all other tuners, by moving 
this into tuner-simple's private data area.

Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Michael Krufky 2007-08-11 15:42:12 -03:00 коммит произвёл Mauro Carvalho Chehab
Родитель afa76b392e
Коммит 6b1dde90de
2 изменённых файлов: 25 добавлений и 5 удалений

Просмотреть файл

@ -49,7 +49,6 @@ struct tuner {
unsigned int tv_freq; /* keep track of the current settings */ unsigned int tv_freq; /* keep track of the current settings */
unsigned int radio_freq; unsigned int radio_freq;
u16 last_div;
unsigned int audmode; unsigned int audmode;
v4l2_std_id std; v4l2_std_id std;

Просмотреть файл

@ -82,6 +82,10 @@ MODULE_PARM_DESC(offset,"Allows to specify an offset for tuner");
#define TUNER_PLL_LOCKED 0x40 #define TUNER_PLL_LOCKED 0x40
#define TUNER_STEREO_MK3 0x04 #define TUNER_STEREO_MK3 0x04
struct tuner_simple_priv {
u16 last_div;
};
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
static int tuner_getstatus(struct i2c_client *c) static int tuner_getstatus(struct i2c_client *c)
@ -126,6 +130,7 @@ static int tuner_stereo(struct i2c_client *c)
static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
{ {
struct tuner *t = i2c_get_clientdata(c); struct tuner *t = i2c_get_clientdata(c);
struct tuner_simple_priv *priv = t->priv;
u8 config, cb, tuneraddr; u8 config, cb, tuneraddr;
u16 div; u16 div;
struct tunertype *tun; struct tunertype *tun;
@ -291,7 +296,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
break; break;
} }
if (params->cb_first_if_lower_freq && div < t->last_div) { if (params->cb_first_if_lower_freq && div < priv->last_div) {
buffer[0] = config; buffer[0] = config;
buffer[1] = cb; buffer[1] = cb;
buffer[2] = (div>>8) & 0x7f; buffer[2] = (div>>8) & 0x7f;
@ -302,7 +307,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
buffer[2] = config; buffer[2] = config;
buffer[3] = cb; buffer[3] = cb;
} }
t->last_div = div; priv->last_div = div;
if (params->has_tda9887) { if (params->has_tda9887) {
int config = 0; int config = 0;
int is_secam_l = (t->std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) && int is_secam_l = (t->std & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) &&
@ -399,6 +404,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
{ {
struct tunertype *tun; struct tunertype *tun;
struct tuner *t = i2c_get_clientdata(c); struct tuner *t = i2c_get_clientdata(c);
struct tuner_simple_priv *priv = t->priv;
u8 buffer[4]; u8 buffer[4];
u16 div; u16 div;
int rc, j; int rc, j;
@ -464,7 +470,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
freq * (1/800) */ freq * (1/800) */
div = (freq + 400) / 800; div = (freq + 400) / 800;
if (params->cb_first_if_lower_freq && div < t->last_div) { if (params->cb_first_if_lower_freq && div < priv->last_div) {
buffer[0] = buffer[2]; buffer[0] = buffer[2];
buffer[1] = buffer[3]; buffer[1] = buffer[3];
buffer[2] = (div>>8) & 0x7f; buffer[2] = (div>>8) & 0x7f;
@ -476,7 +482,7 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n", tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n",
buffer[0],buffer[1],buffer[2],buffer[3]); buffer[0],buffer[1],buffer[2],buffer[3]);
t->last_div = div; priv->last_div = div;
if (params->has_tda9887) { if (params->has_tda9887) {
int config = 0; int config = 0;
@ -498,16 +504,31 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
} }
static void tuner_release(struct i2c_client *c)
{
struct tuner *t = i2c_get_clientdata(c);
kfree(t->priv);
t->priv = NULL;
}
static struct tuner_operations simple_tuner_ops = { static struct tuner_operations simple_tuner_ops = {
.set_tv_freq = default_set_tv_freq, .set_tv_freq = default_set_tv_freq,
.set_radio_freq = default_set_radio_freq, .set_radio_freq = default_set_radio_freq,
.has_signal = tuner_signal, .has_signal = tuner_signal,
.is_stereo = tuner_stereo, .is_stereo = tuner_stereo,
.release = tuner_release,
}; };
int default_tuner_init(struct i2c_client *c) int default_tuner_init(struct i2c_client *c)
{ {
struct tuner *t = i2c_get_clientdata(c); struct tuner *t = i2c_get_clientdata(c);
struct tuner_simple_priv *priv = NULL;
priv = kzalloc(sizeof(struct tuner_simple_priv), GFP_KERNEL);
if (priv == NULL)
return -ENOMEM;
t->priv = priv;
tuner_info("type set to %d (%s)\n", tuner_info("type set to %d (%s)\n",
t->type, tuners[t->type].name); t->type, tuners[t->type].name);