diff options
| -rw-r--r-- | linux/Documentation/video4linux/v4l2-framework.txt | 6 | ||||
| -rw-r--r-- | linux/drivers/media/video/cx25840/cx25840-core.c | 18 | ||||
| -rw-r--r-- | linux/include/media/cx25840.h | 12 | 
3 files changed, 36 insertions, 0 deletions
| diff --git a/linux/Documentation/video4linux/v4l2-framework.txt b/linux/Documentation/video4linux/v4l2-framework.txt index ff124374e..cc3506242 100644 --- a/linux/Documentation/video4linux/v4l2-framework.txt +++ b/linux/Documentation/video4linux/v4l2-framework.txt @@ -340,6 +340,12 @@ Make sure to call v4l2_device_unregister_subdev(sd) when the remove() callback  is called. This will unregister the sub-device from the bridge driver. It is  safe to call this even if the sub-device was never registered. +You need to do this because when the bridge driver destroys the i2c adapter +the remove() callbacks are called of the i2c devices on that adapter. +After that the corresponding v4l2_subdev structures are invalid, so they +have to be unregistered first. Calling v4l2_device_unregister_subdev(sd) +from the remove() callback ensures that this is always done correctly. +  The bridge driver also has some helper functions it can use: diff --git a/linux/drivers/media/video/cx25840/cx25840-core.c b/linux/drivers/media/video/cx25840/cx25840-core.c index 479700c8c..6d324002a 100644 --- a/linux/drivers/media/video/cx25840/cx25840-core.c +++ b/linux/drivers/media/video/cx25840/cx25840-core.c @@ -1120,6 +1120,16 @@ static void log_audio_status(struct i2c_client *client)  /* ----------------------------------------------------------------------- */ +/* This init operation must be called to load the driver's firmware. +   Without this the audio standard detection will fail and you will +   only get mono. + +   Since loading the firmware is often problematic when the driver is +   compiled into the kernel I recommend postponing calling this function +   until the first open of the video device. Another reason for +   postponing it is that loading this firmware takes a long time (seconds) +   due to the slow i2c bus speed. So it will speed up the boot process if +   you can avoid loading the fw as long as the video device isn't used.  */  static int cx25840_init(struct v4l2_subdev *sd, u32 val)  {  	struct cx25840_state *state = to_state(sd); @@ -1401,6 +1411,14 @@ static int cx25840_log_status(struct v4l2_subdev *sd)  static int cx25840_command(struct i2c_client *client, unsigned cmd, void *arg)  { +	/* ignore this command */ +	if (cmd == TUNER_SET_TYPE_ADDR) +		return 0; + +	/* Old-style drivers rely on initialization on first use, so +	   call the init whenever a command is issued to this driver. +	   New-style drivers using v4l2_subdev should call init explicitly. */ +	cx25840_init(i2c_get_clientdata(client), 0);  	return v4l2_subdev_command(i2c_get_clientdata(client), cmd, arg);  } diff --git a/linux/include/media/cx25840.h b/linux/include/media/cx25840.h index db431d513..2c3fbaa33 100644 --- a/linux/include/media/cx25840.h +++ b/linux/include/media/cx25840.h @@ -21,6 +21,18 @@  #ifndef _CX25840_H_  #define _CX25840_H_ +/* Note that the cx25840 driver requires that the bridge driver calls the +   v4l2_subdev's init operation in order to load the driver's firmware. +   Without this the audio standard detection will fail and you will +   only get mono. + +   Since loading the firmware is often problematic when the driver is +   compiled into the kernel I recommend postponing calling this function +   until the first open of the video device. Another reason for +   postponing it is that loading this firmware takes a long time (seconds) +   due to the slow i2c bus speed. So it will speed up the boot process if +   you can avoid loading the fw as long as the video device isn't used. */ +  enum cx25840_video_input {  	/* Composite video inputs In1-In8 */  	CX25840_COMPOSITE1 = 1, | 
