Re: REVIEW: bttv conversion to v4l2_subdev

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On Mon, 16 Mar 2009 08:09:44 -0300
> Mauro Carvalho Chehab <mchehab@xxxxxxxxxxxxx> wrote:
>
>> > >> > > > > Can you review my ~hverkuil/v4l-dvb-bttv2 tree?
>
> Ok, it was not that hard. It follows my comments.
>
>> --- a/linux/drivers/media/video/bt8xx/bttv-cards.c	Sun Mar 15 10:53:32
>> 2009 +0100
>> +++ b/linux/drivers/media/video/bt8xx/bttv-cards.c	Sun Mar 15 13:07:15
>> 2009 +0100
>> @@ -97,12 +97,8 @@ static unsigned int tuner[BTTV_MAX]  = {
>>  static unsigned int tuner[BTTV_MAX]  = { [ 0 ... (BTTV_MAX-1) ] = UNSET
>> };
>>  static unsigned int svhs[BTTV_MAX]   = { [ 0 ... (BTTV_MAX-1) ] = UNSET
>> };
>>  static unsigned int remote[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET
>> };
>> +static unsigned int tvaudio[BTTV_MAX] = { [0 ... (BTTV_MAX - 1)] =
>> UNSET };
>>  static struct bttv  *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL
>> };
>> -#ifdef MODULE
>> -static unsigned int autoload = 1;
>> -#else
>> -static unsigned int autoload;
>> -#endif
>>  static unsigned int gpiomask = UNSET;
>>  static unsigned int audioall = UNSET;
>>  static unsigned int audiomux[5] = { [ 0 ... 4 ] = UNSET };
>> @@ -114,13 +110,13 @@ module_param(latency,    int, 0444);
>>  module_param(latency,    int, 0444);
>>  module_param(gpiomask,   int, 0444);
>>  module_param(audioall,   int, 0444);
>> -module_param(autoload,   int, 0444);
>
> As already discussed, instead of removing, just print some warning if
> people
> use this parameter. The printed message should ideally direct to some wiki
> page
> commenting about the changes, and explaining how to emulate the previous
> behaviour where such parameter were needed.

Acked.

>
>>
>>  module_param_array(card,     int, NULL, 0444);
>>  module_param_array(pll,      int, NULL, 0444);
>>  module_param_array(tuner,    int, NULL, 0444);
>>  module_param_array(svhs,     int, NULL, 0444);
>>  module_param_array(remote,   int, NULL, 0444);
>> +module_param_array(tvaudio,  int, NULL, 0444);
>>  module_param_array(audiomux, int, NULL, 0444);
>>
>>  MODULE_PARM_DESC(triton1,"set ETBF pci config bit "
>> @@ -131,7 +127,8 @@ MODULE_PARM_DESC(card,"specify TV/grabbe
>>  MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file
>> for a list");
>>  MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz,
>> 35=35 MHz)");
>>  MODULE_PARM_DESC(tuner,"specify installed tuner type");
>> -MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o,
>> default is 1 (yes)");
>> +MODULE_PARM_DESC(tvaudio, "specify whether tvaudio should be loaded (1)
>> or not (0),"
>> +		 " default is autodetect");
>>  MODULE_PARM_DESC(no_overlay,"allow override overlay default (0
>> disables, 1 enables)"
>>  		" [some VIA/SIS chipsets are known to have problem with overlay]");
>>
>> @@ -3333,8 +3330,10 @@ void __devinit bttv_init_card2(struct bt
>>  void __devinit bttv_init_card2(struct bttv *btv)
>>  {
>>  	int addr=ADDR_UNSET;
>> +	int load_tvaudio = tvaudio[btv->c.nr];
>>
>>  	btv->tuner_type = UNSET;
>> +	btv->has_saa6588 = bttv_tvcards[btv->c.type].has_saa6588;
>>
>>  	if (BTTV_BOARD_UNKNOWN == btv->c.type) {
>>  		bttv_readee(btv,eeprom_data,0xa0);
>> @@ -3502,8 +3501,13 @@ void __devinit bttv_init_card2(struct bt
>>  		struct tuner_setup tun_setup;
>>
>>  		/* Load tuner module before issuing tuner config call! */
>> -		if (autoload)
>> -			request_module("tuner");
>> +		if (bttv_tvcards[btv->c.type].has_radio)
>> +			v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
>> +				"tuner", "tuner", v4l2_i2c_tuner_addrs(ADDRS_RADIO));
>> +		v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap, "tuner",
>> +				"tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
>> +		v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap, "tuner",
>> +				"tuner", v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));
>
> There are several bttv boards without tuner. In fact, those are becoming
> a more common setup with bttv, since there are still several surveillance
> boards with bttv being selled in the market. We should test if
> !TUNER_ABSENT
> before doing the probe for a tuner.

Hmm? This code is already inside an 'if (btv->tuner_type != TUNER_ABSENT)'.

>>  		tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
>>  		tun_setup.type = btv->tuner_type;
>> @@ -3512,7 +3516,7 @@ void __devinit bttv_init_card2(struct bt
>>  		if (bttv_tvcards[btv->c.type].has_radio)
>>  			tun_setup.mode_mask |= T_RADIO;
>>
>> -		bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup);
>> +		bttv_call_all(btv, tuner, s_type_addr, &tun_setup);
>>  	}
>>
>>  	if (btv->tda9887_conf) {
>> @@ -3521,7 +3525,7 @@ void __devinit bttv_init_card2(struct bt
>>  		tda9887_cfg.tuner = TUNER_TDA9887;
>>  		tda9887_cfg.priv = &btv->tda9887_conf;
>>
>> -		bttv_call_i2c_clients(btv, TUNER_SET_CONFIG, &tda9887_cfg);
>> +		bttv_call_all(btv, tuner, s_config, &tda9887_cfg);
>>  	}
>>
>>  	btv->dig = bttv_tvcards[btv->c.type].has_dig_in ?
>> @@ -3544,31 +3548,94 @@ void __devinit bttv_init_card2(struct bt
>>  	if (bttv_tvcards[btv->c.type].audio_mode_gpio)
>>  		btv->audio_mode_gpio=bttv_tvcards[btv->c.type].audio_mode_gpio;
>>
>> -	if (!autoload)
>> -		return;
>> -
>>  	if (btv->tuner_type == TUNER_ABSENT)
>>  		return;  /* no tuner or related drivers to load */
>>
>> +	if (btv->has_saa6588) {
>> +		/* Probe for RDS receiver chip */
>> +		static const unsigned short addrs[] = {
>> +			0x20 >> 1,
>> +			0x22 >> 1,
>> +			I2C_CLIENT_END
>> +		};
>> +
>> +		btv->sd_rds = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
>> +				"saa6588", "saa6588", addrs);
>> +	}
>> +
>>  	/* try to detect audio/fader chips */
>> -	if (!bttv_tvcards[btv->c.type].no_msp34xx &&
>> -	    bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx") >=0)
>> -		request_module("msp3400");
>> -
>> -	if (bttv_tvcards[btv->c.type].msp34xx_alt &&
>> -	    bttv_I2CRead(btv, I2C_ADDR_MSP3400_ALT, "MSP34xx (alternate
>> address)") >=0)
>> -		request_module("msp3400");
>> -
>> -	if (!bttv_tvcards[btv->c.type].no_tda9875 &&
>> -	    bttv_I2CRead(btv, I2C_ADDR_TDA9875, "TDA9875") >=0)
>> -		request_module("tda9875");
>> -
>> -	if (!bttv_tvcards[btv->c.type].no_tda7432 &&
>> -	    bttv_I2CRead(btv, I2C_ADDR_TDA7432, "TDA7432") >=0)
>> -		request_module("tda7432");
>> -
>> -	if (bttv_tvcards[btv->c.type].needs_tvaudio)
>> -		request_module("tvaudio");
>> +
>> +	/* probe for msp3400 first: this driver can detect whether or not
>> +	   it really is a msp3400, so it will return NULL when the device
>> +	   found is really something else (e.g. a tea6300). */
>> +	if (bttv_tvcards[btv->c.type].msp34xx_alt) {
>> +		static const unsigned short addrs[] = {
>> +			I2C_ADDR_MSP3400_ALT >> 1,
>> +			I2C_CLIENT_END
>> +		};
>
> Why aren't you probing first at I2C_ADDR_MSP3400? You're changing the
> behaviour
> here. It is better to probe at the same order as the previous version.

OK.

>> +
>> +		btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
>> +				"msp3400", "msp3400", addrs);
>> +	} else if (!bttv_tvcards[btv->c.type].no_msp34xx) {
>> +		static const unsigned short addrs[] = {
>> +			I2C_ADDR_MSP3400 >> 1,
>> +			I2C_CLIENT_END
>> +		};
>> +
>> +		btv->sd_msp34xx = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
>> +				"msp3400", "msp3400", addrs);
>> +	}
>
> Why do you need to probe it twice? Shouldn't it be just one probing for
> both addresses?

The original code is actually doing its own probing for just one address.
So this replicates the original behavior.

>
>> +
>> +	/* If we found a msp34xx, then we're done. */
>> +	if (btv->sd_msp34xx)
>> +		return;
>> +
>> +	if (load_tvaudio != UNSET) {
>> +		printk(KERN_INFO "bttv%d: if you need to set the tvaudio module
>> option to %d, then the\n",
>> +				btv->c.nr, load_tvaudio);
>> +		printk(KERN_INFO "bttv%d: definition for card type %d needs to be
>> updated.\n",
>> +				btv->c.nr, btv->c.type);
>> +		printk(KERN_INFO "bttv%d: please report this to the bttv
>> maintainer.\n", btv->c.nr);
>
> This is not what I call "tvaudio autodectect" (that should be the default
> way,
> as the comments for tvaudio option states).
>
> A bttv board should have some audio chip otherwise audio won't work.
>
> I dunno if is there any supported card without audio at all, but probably,
> if
> we have, this is by far much less than boards with an audio chip.
>
> Based on this principle, IMO, the probing function should, by default,
> probe
> for tvaudio, if it doesn't find another audio device. You may eventually
> ask
> for people to report, to warn us that the board entry is broken, but we
> shouln't intentionally break a device that we're almost sure that requires
> tvaudio or tda7432.

OK. In other words it would be better to probe for:

1) msp3400
2) msp3400_alt
3) tda7432
4) tvaudio

and return as soon as we find a chip. So tvaudio is probed
unconditionally, effectively ignoring the needs_tvaudio flag and only
honoring the tvaudio module option (although I'm not sure whether that is
still needed in that case).

>> +	} else {
>> +		/* tda9875 is now also handled by tvaudio. It used to be
>> +		   handled by the tda9875 module, but that causes problems
>> +		   in detecting whether you have a tda9874 or tda9875. It is
>> +		   better to use tvaudio for both. */
>> +		load_tvaudio = bttv_tvcards[btv->c.type].needs_tvaudio ||
>> +			!bttv_tvcards[btv->c.type].no_tda9875;
>> +	}
>> +
>> +	/* Now see if we can find one of the tvaudio devices. */
>> +	if (load_tvaudio) {
>> +		static const unsigned short addrs[] = {
>> +			I2C_ADDR_TDA8425   >> 1,
>> +			I2C_ADDR_TEA6300   >> 1,
>> +			I2C_ADDR_TEA6420   >> 1,
>> +			I2C_ADDR_TDA9840   >> 1,
>> +			I2C_ADDR_TDA985x_L >> 1,
>> +			I2C_ADDR_TDA985x_H >> 1,
>> +			I2C_ADDR_TDA9874   >> 1,
>> +			I2C_ADDR_PIC16C54  >> 1,
>> +			I2C_CLIENT_END
>> +		};
>
> We should preserve the same probing order as before, in order to reduce
> breakage risks.

It is the same order.

>> +
>> +		btv->sd_tvaudio = v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap,
>> +				"tvaudio", "tvaudio", addrs);
>> +		/* If we found a device supported by tvaudio, then we're done
>> +		   as well. */
>> +		if (btv->sd_tvaudio)
>> +			return;
>> +	}
>> +	/* Last possibility: it might be a tda7432. */
>> +	if (!bttv_tvcards[btv->c.type].no_tda7432) {
>> +		static const unsigned short addrs[] = {
>> +			I2C_ADDR_TDA7432 >> 1,
>> +			I2C_CLIENT_END
>> +		};
>> +
>> +		v4l2_i2c_new_probed_subdev(&btv->c.i2c_adap, "tda7432",
>> +				"tda7432", addrs);
>> +	}
>
> No audio module found. This requires printing a warning, since the board
> won't have audio working.

OK.

>>  }
>>
>>
>> @@ -3640,6 +3707,7 @@ static int terratec_active_radio_upgrade
>>  		printk("bttv%d: Terratec Active Radio Upgrade found.\n",
>>  		       btv->c.nr);
>>  		btv->has_radio    = 1;
>> +		btv->has_saa6588  = 1;
>>  		btv->has_matchbox = 1;
>>  	} else {
>>  		btv->has_radio    = 0;
>> --- a/linux/drivers/media/video/bt8xx/bttv-driver.c	Sun Mar 15 10:53:32
>> 2009 +0100
>> +++ b/linux/drivers/media/video/bt8xx/bttv-driver.c	Sun Mar 15 13:07:15
>> 2009 +0100
>> @@ -1181,7 +1181,6 @@ audio_mux(struct bttv *btv, int input, i
>>  {
>>  	int gpio_val, signal;
>>  	struct v4l2_control ctrl;
>> -	struct i2c_client *c;
>>
>>  	gpio_inout(bttv_tvcards[btv->c.type].gpiomask,
>>  		   bttv_tvcards[btv->c.type].gpiomask);
>> @@ -1220,9 +1219,8 @@ audio_mux(struct bttv *btv, int input, i
>>
>>  	ctrl.id = V4L2_CID_AUDIO_MUTE;
>>  	ctrl.value = btv->mute;
>> -	bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, &ctrl);
>> -	c = btv->i2c_msp34xx_client;
>> -	if (c) {
>> +	bttv_call_all(btv, core, s_ctrl, &ctrl);
>> +	if (btv->sd_msp34xx) {
>>  		struct v4l2_routing route;
>>
>>  		/* Note: the inputs tuner/radio/extern/intern are translated
>> @@ -1261,15 +1259,14 @@ audio_mux(struct bttv *btv, int input, i
>>  			break;
>>  		}
>>  		route.output = MSP_OUTPUT_DEFAULT;
>> -		c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
>> -	}
>> -	c = btv->i2c_tvaudio_client;
>> -	if (c) {
>> +		v4l2_subdev_call(btv->sd_msp34xx, audio, s_routing, &route);
>> +	}
>> +	if (btv->sd_tvaudio) {
>>  		struct v4l2_routing route;
>>
>>  		route.input = input;
>>  		route.output = 0;
>> -		c->driver->command(c, VIDIOC_INT_S_AUDIO_ROUTING, &route);
>> +		v4l2_subdev_call(btv->sd_tvaudio, audio, s_routing, &route);
>>  	}
>>  	return 0;
>>  }
>> @@ -1360,7 +1357,7 @@ set_tvnorm(struct bttv *btv, unsigned in
>>  #endif
>>  	}
>>  	id = tvnorm->v4l2_id;
>> -	bttv_call_i2c_clients(btv, VIDIOC_S_STD, &id);
>> +	bttv_call_all(btv, tuner, s_std, id);
>>
>>  	return 0;
>>  }
>> @@ -1504,7 +1501,7 @@ static int bttv_g_ctrl(struct file *file
>>  	case V4L2_CID_AUDIO_BALANCE:
>>  	case V4L2_CID_AUDIO_BASS:
>>  	case V4L2_CID_AUDIO_TREBLE:
>> -		bttv_call_i2c_clients(btv, VIDIOC_G_CTRL, c);
>> +		bttv_call_all(btv, core, g_ctrl, c);
>>  		break;
>>
>>  	case V4L2_CID_PRIVATE_CHROMA_AGC:
>> @@ -1578,12 +1575,12 @@ static int bttv_s_ctrl(struct file *file
>>  		if (btv->volume_gpio)
>>  			btv->volume_gpio(btv, c->value);
>>
>> -		bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c);
>> +		bttv_call_all(btv, core, s_ctrl, c);
>>  		break;
>>  	case V4L2_CID_AUDIO_BALANCE:
>>  	case V4L2_CID_AUDIO_BASS:
>>  	case V4L2_CID_AUDIO_TREBLE:
>> -		bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c);
>> +		bttv_call_all(btv, core, s_ctrl, c);
>>  		break;
>>
>>  	case V4L2_CID_PRIVATE_CHROMA_AGC:
>> @@ -2001,7 +1998,7 @@ static int bttv_s_tuner(struct file *fil
>>  		return -EINVAL;
>>
>>  	mutex_lock(&btv->lock);
>> -	bttv_call_i2c_clients(btv, VIDIOC_S_TUNER, t);
>> +	bttv_call_all(btv, tuner, s_tuner, t);
>>
>>  	if (btv->audio_mode_gpio)
>>  		btv->audio_mode_gpio(btv, t, 1);
>> @@ -2046,7 +2043,7 @@ static int bttv_s_frequency(struct file
>>  		return -EINVAL;
>>  	mutex_lock(&btv->lock);
>>  	btv->freq = f->frequency;
>> -	bttv_call_i2c_clients(btv, VIDIOC_S_FREQUENCY, f);
>> +	bttv_call_all(btv, tuner, s_frequency, f);
>>  	if (btv->has_matchbox && btv->radio_user)
>>  		tea5757_set_freq(btv, btv->freq);
>>  	mutex_unlock(&btv->lock);
>> @@ -2060,7 +2057,7 @@ static int bttv_log_status(struct file *
>>
>>  	printk(KERN_INFO "bttv%d: ========  START STATUS CARD #%d
>> ========\n",
>>  			btv->c.nr, btv->c.nr);
>> -	bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
>> +	bttv_call_all(btv, core, log_status);
>>  	printk(KERN_INFO "bttv%d: ========  END STATUS CARD   #%d
>> ========\n",
>>  			btv->c.nr, btv->c.nr);
>>  	return 0;
>> @@ -2976,7 +2973,7 @@ static int bttv_g_tuner(struct file *fil
>>
>>  	mutex_lock(&btv->lock);
>>  	t->rxsubchans = V4L2_TUNER_SUB_MONO;
>> -	bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
>> +	bttv_call_all(btv, tuner, g_tuner, t);
>>  	strcpy(t->name, "Television");
>>  	t->capability = V4L2_TUNER_CAP_NORM;
>>  	t->type       = V4L2_TUNER_ANALOG_TV;
>> @@ -3467,7 +3464,7 @@ static int radio_open(struct file *file)
>>
>>  	btv->radio_user++;
>>
>> -	bttv_call_i2c_clients(btv,AUDC_SET_RADIO,NULL);
>> +	bttv_call_all(btv, tuner, s_radio);
>>  	audio_input(btv,TVAUDIO_INPUT_RADIO);
>>
>>  	mutex_unlock(&btv->lock);
>> @@ -3487,7 +3484,7 @@ static int radio_release(struct file *fi
>>
>>  	btv->radio_user--;
>>
>> -	bttv_call_i2c_clients(btv, RDS_CMD_CLOSE, &cmd);
>> +	bttv_call_all(btv, core, ioctl, RDS_CMD_CLOSE, &cmd);
>>
>>  	return 0;
>>  }
>> @@ -3520,7 +3517,7 @@ static int radio_g_tuner(struct file *fi
>>  	strcpy(t->name, "Radio");
>>  	t->type = V4L2_TUNER_RADIO;
>>
>> -	bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
>> +	bttv_call_all(btv, tuner, g_tuner, t);
>>
>>  	if (btv->audio_mode_gpio)
>>  		btv->audio_mode_gpio(btv, t, 0);
>> @@ -3562,7 +3559,7 @@ static int radio_s_tuner(struct file *fi
>>  	if (0 != t->index)
>>  		return -EINVAL;
>>
>> -	bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
>> +	bttv_call_all(btv, tuner, g_tuner, t);
>>  	return 0;
>>  }
>>
>> @@ -3623,7 +3620,7 @@ static ssize_t radio_read(struct file *f
>>  	cmd.instance = file;
>>  	cmd.result = -ENODEV;
>>
>> -	bttv_call_i2c_clients(btv, RDS_CMD_READ, &cmd);
>> +	bttv_call_all(btv, core, ioctl, RDS_CMD_READ, &cmd);
>>
>>  	return cmd.result;
>>  }
>> @@ -3636,7 +3633,7 @@ static unsigned int radio_poll(struct fi
>>  	cmd.instance = file;
>>  	cmd.event_list = wait;
>>  	cmd.result = -ENODEV;
>> -	bttv_call_i2c_clients(btv, RDS_CMD_POLL, &cmd);
>> +	bttv_call_all(btv, core, ioctl, RDS_CMD_POLL, &cmd);
>>
>>  	return cmd.result;
>>  }
>> --- a/linux/drivers/media/video/bt8xx/bttv-i2c.c	Sun Mar 15 10:53:32
>> 2009 +0100
>> +++ b/linux/drivers/media/video/bt8xx/bttv-i2c.c	Sun Mar 15 13:07:15
>> 2009 +0100
>> @@ -35,8 +35,6 @@
>>  #include <media/v4l2-common.h>
>>  #include <linux/jiffies.h>
>>  #include <asm/io.h>
>> -
>> -static int attach_inform(struct i2c_client *client);
>>
>>  static int i2c_debug;
>>  static int i2c_hw;
>> @@ -269,51 +267,6 @@ static const struct i2c_algorithm bttv_a
>>  /*
>> -----------------------------------------------------------------------
>> */
>>  /* I2C functions - common stuff
>>    */
>>
>> -static int attach_inform(struct i2c_client *client)
>> -{
>> -	struct v4l2_device *v4l2_dev = i2c_get_adapdata(client->adapter);
>> -	struct bttv *btv = to_bttv(v4l2_dev);
>> -	int addr=ADDR_UNSET;
>> -
>> -
>> -	if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr)
>> -		addr = bttv_tvcards[btv->c.type].tuner_addr;
>> -
>> -
>> -	if (bttv_debug)
>> -		printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n",
>> -			btv->c.nr, client->driver->driver.name, client->addr,
>> -			client->name);
>
> It is still valid to print a message when a device is attached at i2c bus,
> for debugging purposes.

Each i2c driver already prints a message when it is found, so this is just
duplicating that. It adds nothing new. The only reason for this callback
was to support autoprobing.

>> -	if (!client->driver->command)
>> -		return 0;
>> -
>> -	if (client->driver->id == I2C_DRIVERID_MSP3400)
>> -		btv->i2c_msp34xx_client = client;
>> -	if (client->driver->id == I2C_DRIVERID_TVAUDIO)
>> -		btv->i2c_tvaudio_client = client;
>> -	if (btv->tuner_type != TUNER_ABSENT) {
>> -		struct tuner_setup tun_setup;
>> -
>> -		if (addr == ADDR_UNSET || addr == client->addr) {
>> -			tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV | T_RADIO;
>> -			tun_setup.type = btv->tuner_type;
>> -			tun_setup.addr = addr;
>> -			bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup);
>> -		}
>> -
>> -	}
>> -
>> -	return 0;
>> -}
>> -
>> -void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void
>> *arg)
>> -{
>> -	if (0 != btv->i2c_rc)
>> -		return;
>> -	i2c_clients_command(&btv->c.i2c_adap, cmd, arg);
>> -}
>> -
>> -
>>  /* read I2C */
>>  int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for)
>>  {
>> @@ -424,8 +377,9 @@ int __devinit init_bttv_i2c(struct bttv
>>  		btv->c.i2c_adap.algo_data = &btv->i2c_algo;
>>  	}
>>  	btv->c.i2c_adap.owner = THIS_MODULE;
>> +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
>>  	btv->c.i2c_adap.class = I2C_CLASS_TV_ANALOG;
>> -	btv->c.i2c_adap.client_register = attach_inform;
>> +#endif
>>
>>  	btv->c.i2c_adap.dev.parent = &btv->c.pci->dev;
>>  	snprintf(btv->c.i2c_adap.name, sizeof(btv->c.i2c_adap.name),
>> @@ -435,10 +389,12 @@ int __devinit init_bttv_i2c(struct bttv
>>  	i2c_set_adapdata(&btv->c.i2c_adap, &btv->c.v4l2_dev);
>>  	btv->i2c_client.adapter = &btv->c.i2c_adap;
>>
>> +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22)
>>  	if (bttv_tvcards[btv->c.type].no_video)
>>  		btv->c.i2c_adap.class &= ~I2C_CLASS_TV_ANALOG;
>>  	if (bttv_tvcards[btv->c.type].has_dvb)
>>  		btv->c.i2c_adap.class |= I2C_CLASS_TV_DIGITAL;
>> +#endif
>>
>>  	if (btv->use_i2c_hw) {
>>  		btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap);
>> --- a/linux/drivers/media/video/bt8xx/bttv.h	Sun Mar 15 10:53:32 2009
>> +0100
>> +++ b/linux/drivers/media/video/bt8xx/bttv.h	Sun Mar 15 13:07:15 2009
>> +0100
>> @@ -242,6 +242,7 @@ struct tvcard {
>>  	unsigned int msp34xx_alt:1;
>>
>>  	unsigned int no_video:1; /* video pci function is unused */
>> +	unsigned int has_saa6588:1;
>>  	unsigned int has_dvb:1;
>>  	unsigned int has_remote:1;
>>  	unsigned int has_radio:1;
>> @@ -357,7 +358,9 @@ void bttv_gpio_bits(struct bttv_core *co
>>  /* ---------------------------------------------------------- */
>>  /* i2c                                                        */
>>
>> -extern void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd,
>> void *arg);
>> +#define bttv_call_all(btv, o, f, args...) \
>> +	v4l2_device_call_all(&btv->c.v4l2_dev, 0, o, f, ##args)
>> +
>>  extern int bttv_I2CRead(struct bttv *btv, unsigned char addr, char
>> *probe_for);
>>  extern int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned
>> char b1,
>>  			 unsigned char b2, int both);
>> --- a/linux/drivers/media/video/bt8xx/bttvp.h	Sun Mar 15 10:53:32 2009
>> +0100
>> +++ b/linux/drivers/media/video/bt8xx/bttvp.h	Sun Mar 15 13:07:15 2009
>> +0100
>> @@ -331,6 +331,7 @@ struct bttv {
>>  	unsigned int tuner_type;  /* tuner chip type */
>>  	unsigned int tda9887_conf;
>>  	unsigned int svhs, dig;
>> +	int has_saa6588;
>
> Does it need to be a 32 or 64 bit integer?

I'll replace it with a u8.

>
>>  	struct bttv_pll_info pll;
>>  	int triton1;
>>  	int gpioirq;
>> @@ -354,8 +355,9 @@ struct bttv {
>>  	int                        i2c_state, i2c_rc;
>>  	int                        i2c_done;
>>  	wait_queue_head_t          i2c_queue;
>> -	struct i2c_client 	  *i2c_msp34xx_client;
>> -	struct i2c_client 	  *i2c_tvaudio_client;
>> +	struct v4l2_subdev 	  *sd_msp34xx;
>> +	struct v4l2_subdev 	  *sd_tvaudio;
>> +	struct v4l2_subdev 	  *sd_rds;
>>
>>  	/* video4linux (1) */
>>  	struct video_device *video_dev;

Thanks for the review! Much appreciated.

Regards,

       Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux