diff options
Diffstat (limited to 'drivers/media/radio/tef6862.c')
| -rw-r--r-- | drivers/media/radio/tef6862.c | 76 | 
1 files changed, 27 insertions, 49 deletions
diff --git a/drivers/media/radio/tef6862.c b/drivers/media/radio/tef6862.c index 7c0d77751f6..a9319a24c7e 100644 --- a/drivers/media/radio/tef6862.c +++ b/drivers/media/radio/tef6862.c @@ -25,14 +25,13 @@  #include <linux/slab.h>  #include <media/v4l2-ioctl.h>  #include <media/v4l2-device.h> -#include <media/v4l2-chip-ident.h>  #define DRIVER_NAME "tef6862"  #define FREQ_MUL 16000 -#define TEF6862_LO_FREQ (875 * FREQ_MUL / 10) -#define TEF6862_HI_FREQ (108 * FREQ_MUL) +#define TEF6862_LO_FREQ (875U * FREQ_MUL / 10) +#define TEF6862_HI_FREQ (108U * FREQ_MUL)  /* Write mode sub addresses */  #define WM_SUB_BANDWIDTH	0x0 @@ -49,15 +48,15 @@  #define WM_SUB_TEST		0xF  /* Different modes of the MSA register */ -#define MODE_BUFFER		0x0 -#define MODE_PRESET		0x1 -#define MODE_SEARCH		0x2 -#define MODE_AF_UPDATE		0x3 -#define MODE_JUMP		0x4 -#define MODE_CHECK		0x5 -#define MODE_LOAD		0x6 -#define MODE_END		0x7 -#define MODE_SHIFT		5 +#define MSA_MODE_BUFFER		0x0 +#define MSA_MODE_PRESET		0x1 +#define MSA_MODE_SEARCH		0x2 +#define MSA_MODE_AF_UPDATE	0x3 +#define MSA_MODE_JUMP		0x4 +#define MSA_MODE_CHECK		0x5 +#define MSA_MODE_LOAD		0x6 +#define MSA_MODE_END		0x7 +#define MSA_MODE_SHIFT		5  struct tef6862_state {  	struct v4l2_subdev sd; @@ -96,15 +95,16 @@ static int tef6862_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *v)  	return 0;  } -static int tef6862_s_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *v) +static int tef6862_s_tuner(struct v4l2_subdev *sd, const struct v4l2_tuner *v)  {  	return v->index ? -EINVAL : 0;  } -static int tef6862_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f) +static int tef6862_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequency *f)  {  	struct tef6862_state *state = to_state(sd);  	struct i2c_client *client = v4l2_get_subdevdata(sd); +	unsigned freq = f->frequency;  	u16 pll;  	u8 i2cmsg[3];  	int err; @@ -112,15 +112,18 @@ static int tef6862_s_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)  	if (f->tuner != 0)  		return -EINVAL; -	pll = 1964 + ((f->frequency - TEF6862_LO_FREQ) * 20) / FREQ_MUL; -	i2cmsg[0] = (MODE_PRESET << MODE_SHIFT) | WM_SUB_PLLM; +	freq = clamp(freq, TEF6862_LO_FREQ, TEF6862_HI_FREQ); +	pll = 1964 + ((freq - TEF6862_LO_FREQ) * 20) / FREQ_MUL; +	i2cmsg[0] = (MSA_MODE_PRESET << MSA_MODE_SHIFT) | WM_SUB_PLLM;  	i2cmsg[1] = (pll >> 8) & 0xff;  	i2cmsg[2] = pll & 0xff;  	err = i2c_master_send(client, i2cmsg, sizeof(i2cmsg)); -	if (!err) -		state->freq = f->frequency; -	return err; +	if (err != sizeof(i2cmsg)) +		return err < 0 ? err : -EIO; + +	state->freq = freq; +	return 0;  }  static int tef6862_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f) @@ -134,14 +137,6 @@ static int tef6862_g_frequency(struct v4l2_subdev *sd, struct v4l2_frequency *f)  	return 0;  } -static int tef6862_g_chip_ident(struct v4l2_subdev *sd, -	struct v4l2_dbg_chip_ident *chip) -{ -	struct i2c_client *client = v4l2_get_subdevdata(sd); - -	return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_TEF6862, 0); -} -  static const struct v4l2_subdev_tuner_ops tef6862_tuner_ops = {  	.g_tuner = tef6862_g_tuner,  	.s_tuner = tef6862_s_tuner, @@ -149,12 +144,7 @@ static const struct v4l2_subdev_tuner_ops tef6862_tuner_ops = {  	.g_frequency = tef6862_g_frequency,  }; -static const struct v4l2_subdev_core_ops tef6862_core_ops = { -	.g_chip_ident = tef6862_g_chip_ident, -}; -  static const struct v4l2_subdev_ops tef6862_ops = { -	.core = &tef6862_core_ops,  	.tuner = &tef6862_tuner_ops,  }; @@ -163,8 +153,8 @@ static const struct v4l2_subdev_ops tef6862_ops = {   * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'   */ -static int __devinit tef6862_probe(struct i2c_client *client, -			const struct i2c_device_id *id) +static int tef6862_probe(struct i2c_client *client, +			 const struct i2c_device_id *id)  {  	struct tef6862_state *state;  	struct v4l2_subdev *sd; @@ -176,7 +166,7 @@ static int __devinit tef6862_probe(struct i2c_client *client,  	v4l_info(client, "chip found @ 0x%02x (%s)\n",  			client->addr << 1, client->adapter->name); -	state = kmalloc(sizeof(struct tef6862_state), GFP_KERNEL); +	state = kzalloc(sizeof(struct tef6862_state), GFP_KERNEL);  	if (state == NULL)  		return -ENOMEM;  	state->freq = TEF6862_LO_FREQ; @@ -187,7 +177,7 @@ static int __devinit tef6862_probe(struct i2c_client *client,  	return 0;  } -static int __devexit tef6862_remove(struct i2c_client *client) +static int tef6862_remove(struct i2c_client *client)  {  	struct v4l2_subdev *sd = i2c_get_clientdata(client); @@ -213,20 +203,8 @@ static struct i2c_driver tef6862_driver = {  	.id_table	= tef6862_id,  }; -static __init int tef6862_init(void) -{ -	return i2c_add_driver(&tef6862_driver); -} - -static __exit void tef6862_exit(void) -{ -	i2c_del_driver(&tef6862_driver); -} - -module_init(tef6862_init); -module_exit(tef6862_exit); +module_i2c_driver(tef6862_driver);  MODULE_DESCRIPTION("TEF6862 Car Radio Enhanced Selectivity Tuner");  MODULE_AUTHOR("Mocean Laboratories");  MODULE_LICENSE("GPL v2"); -  | 
