Commit c1f03b48 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'media-v3.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
 "some media bug fixes:
   - a Kconfig dependency issue
   - some fixes for af9033/it913x demod to be more reliable and address
     a performance regression
   - cx18: fix an oops on devices with tda8290 tuner
   - two new USB IDs for af9035
   - a couple fixes on smapp driver"

* tag 'media-v3.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  [media] af9035: new IDs: add support for PCTV 78e and PCTV 79e
  [media] af9033: feed clock to RF tuner
  [media] it913x: init tuner on attach
  [media] af9033: update IT9135 tuner inittabs
  [media] Kconfig: do not select SPI bus on sub-driver auto-select
  [media] cx18: fix kernel oops with tda8290 tuner
  [media] smiapp: Set sub-device owner
  [media] smiapp: Fix power count handling
parents 3c2ea702 a04646c0
...@@ -182,7 +182,6 @@ config MEDIA_SUBDRV_AUTOSELECT ...@@ -182,7 +182,6 @@ config MEDIA_SUBDRV_AUTOSELECT
depends on HAS_IOMEM depends on HAS_IOMEM
select I2C select I2C
select I2C_MUX select I2C_MUX
select SPI
default y default y
help help
By default, a media driver auto-selects all possible ancillary By default, a media driver auto-selects all possible ancillary
......
...@@ -280,6 +280,8 @@ ...@@ -280,6 +280,8 @@
#define USB_PID_PCTV_400E 0x020f #define USB_PID_PCTV_400E 0x020f
#define USB_PID_PCTV_450E 0x0222 #define USB_PID_PCTV_450E 0x0222
#define USB_PID_PCTV_452E 0x021f #define USB_PID_PCTV_452E 0x021f
#define USB_PID_PCTV_78E 0x025a
#define USB_PID_PCTV_79E 0x0262
#define USB_PID_REALTEK_RTL2831U 0x2831 #define USB_PID_REALTEK_RTL2831U 0x2831
#define USB_PID_REALTEK_RTL2832U 0x2832 #define USB_PID_REALTEK_RTL2832U 0x2832
#define USB_PID_TECHNOTREND_CONNECT_S2_3600 0x3007 #define USB_PID_TECHNOTREND_CONNECT_S2_3600 0x3007
......
...@@ -314,6 +314,19 @@ static int af9033_init(struct dvb_frontend *fe) ...@@ -314,6 +314,19 @@ static int af9033_init(struct dvb_frontend *fe)
goto err; goto err;
} }
/* feed clock to RF tuner */
switch (state->cfg.tuner) {
case AF9033_TUNER_IT9135_38:
case AF9033_TUNER_IT9135_51:
case AF9033_TUNER_IT9135_52:
case AF9033_TUNER_IT9135_60:
case AF9033_TUNER_IT9135_61:
case AF9033_TUNER_IT9135_62:
ret = af9033_wr_reg(state, 0x80fba8, 0x00);
if (ret < 0)
goto err;
}
/* settings for TS interface */ /* settings for TS interface */
if (state->cfg.ts_mode == AF9033_TS_MODE_USB) { if (state->cfg.ts_mode == AF9033_TS_MODE_USB) {
ret = af9033_wr_reg_mask(state, 0x80f9a5, 0x00, 0x01); ret = af9033_wr_reg_mask(state, 0x80f9a5, 0x00, 0x01);
......
...@@ -1418,7 +1418,7 @@ static const struct reg_val tuner_init_it9135_60[] = { ...@@ -1418,7 +1418,7 @@ static const struct reg_val tuner_init_it9135_60[] = {
{ 0x800068, 0x0a }, { 0x800068, 0x0a },
{ 0x80006a, 0x03 }, { 0x80006a, 0x03 },
{ 0x800070, 0x0a }, { 0x800070, 0x0a },
{ 0x800071, 0x05 }, { 0x800071, 0x0a },
{ 0x800072, 0x02 }, { 0x800072, 0x02 },
{ 0x800075, 0x8c }, { 0x800075, 0x8c },
{ 0x800076, 0x8c }, { 0x800076, 0x8c },
...@@ -1484,7 +1484,6 @@ static const struct reg_val tuner_init_it9135_60[] = { ...@@ -1484,7 +1484,6 @@ static const struct reg_val tuner_init_it9135_60[] = {
{ 0x800104, 0x02 }, { 0x800104, 0x02 },
{ 0x800105, 0xbe }, { 0x800105, 0xbe },
{ 0x800106, 0x00 }, { 0x800106, 0x00 },
{ 0x800109, 0x02 },
{ 0x800115, 0x0a }, { 0x800115, 0x0a },
{ 0x800116, 0x03 }, { 0x800116, 0x03 },
{ 0x80011a, 0xbe }, { 0x80011a, 0xbe },
...@@ -1510,7 +1509,6 @@ static const struct reg_val tuner_init_it9135_60[] = { ...@@ -1510,7 +1509,6 @@ static const struct reg_val tuner_init_it9135_60[] = {
{ 0x80014b, 0x8c }, { 0x80014b, 0x8c },
{ 0x80014d, 0xac }, { 0x80014d, 0xac },
{ 0x80014e, 0xc6 }, { 0x80014e, 0xc6 },
{ 0x80014f, 0x03 },
{ 0x800151, 0x1e }, { 0x800151, 0x1e },
{ 0x800153, 0xbc }, { 0x800153, 0xbc },
{ 0x800178, 0x09 }, { 0x800178, 0x09 },
...@@ -1522,9 +1520,10 @@ static const struct reg_val tuner_init_it9135_60[] = { ...@@ -1522,9 +1520,10 @@ static const struct reg_val tuner_init_it9135_60[] = {
{ 0x80018d, 0x5f }, { 0x80018d, 0x5f },
{ 0x80018f, 0xa0 }, { 0x80018f, 0xa0 },
{ 0x800190, 0x5a }, { 0x800190, 0x5a },
{ 0x80ed02, 0xff }, { 0x800191, 0x00 },
{ 0x80ee42, 0xff }, { 0x80ed02, 0x40 },
{ 0x80ee82, 0xff }, { 0x80ee42, 0x40 },
{ 0x80ee82, 0x40 },
{ 0x80f000, 0x0f }, { 0x80f000, 0x0f },
{ 0x80f01f, 0x8c }, { 0x80f01f, 0x8c },
{ 0x80f020, 0x00 }, { 0x80f020, 0x00 },
...@@ -1699,7 +1698,6 @@ static const struct reg_val tuner_init_it9135_61[] = { ...@@ -1699,7 +1698,6 @@ static const struct reg_val tuner_init_it9135_61[] = {
{ 0x800104, 0x02 }, { 0x800104, 0x02 },
{ 0x800105, 0xc8 }, { 0x800105, 0xc8 },
{ 0x800106, 0x00 }, { 0x800106, 0x00 },
{ 0x800109, 0x02 },
{ 0x800115, 0x0a }, { 0x800115, 0x0a },
{ 0x800116, 0x03 }, { 0x800116, 0x03 },
{ 0x80011a, 0xc6 }, { 0x80011a, 0xc6 },
...@@ -1725,7 +1723,6 @@ static const struct reg_val tuner_init_it9135_61[] = { ...@@ -1725,7 +1723,6 @@ static const struct reg_val tuner_init_it9135_61[] = {
{ 0x80014b, 0x8c }, { 0x80014b, 0x8c },
{ 0x80014d, 0xa8 }, { 0x80014d, 0xa8 },
{ 0x80014e, 0xc6 }, { 0x80014e, 0xc6 },
{ 0x80014f, 0x03 },
{ 0x800151, 0x28 }, { 0x800151, 0x28 },
{ 0x800153, 0xcc }, { 0x800153, 0xcc },
{ 0x800178, 0x09 }, { 0x800178, 0x09 },
...@@ -1737,9 +1734,10 @@ static const struct reg_val tuner_init_it9135_61[] = { ...@@ -1737,9 +1734,10 @@ static const struct reg_val tuner_init_it9135_61[] = {
{ 0x80018d, 0x5f }, { 0x80018d, 0x5f },
{ 0x80018f, 0xfb }, { 0x80018f, 0xfb },
{ 0x800190, 0x5c }, { 0x800190, 0x5c },
{ 0x80ed02, 0xff }, { 0x800191, 0x00 },
{ 0x80ee42, 0xff }, { 0x80ed02, 0x40 },
{ 0x80ee82, 0xff }, { 0x80ee42, 0x40 },
{ 0x80ee82, 0x40 },
{ 0x80f000, 0x0f }, { 0x80f000, 0x0f },
{ 0x80f01f, 0x8c }, { 0x80f01f, 0x8c },
{ 0x80f020, 0x00 }, { 0x80f020, 0x00 },
......
...@@ -1282,19 +1282,12 @@ static int smiapp_set_power(struct v4l2_subdev *subdev, int on) ...@@ -1282,19 +1282,12 @@ static int smiapp_set_power(struct v4l2_subdev *subdev, int on)
mutex_lock(&sensor->power_mutex); mutex_lock(&sensor->power_mutex);
/* if (on && !sensor->power_count) {
* If the power count is modified from 0 to != 0 or from != 0
* to 0, update the power state.
*/
if (!sensor->power_count == !on)
goto out;
if (on) {
/* Power on and perform initialisation. */ /* Power on and perform initialisation. */
ret = smiapp_power_on(sensor); ret = smiapp_power_on(sensor);
if (ret < 0) if (ret < 0)
goto out; goto out;
} else { } else if (!on && sensor->power_count == 1) {
smiapp_power_off(sensor); smiapp_power_off(sensor);
} }
...@@ -2572,7 +2565,7 @@ static int smiapp_registered(struct v4l2_subdev *subdev) ...@@ -2572,7 +2565,7 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
this->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; this->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
this->sd.internal_ops = &smiapp_internal_ops; this->sd.internal_ops = &smiapp_internal_ops;
this->sd.owner = NULL; this->sd.owner = THIS_MODULE;
v4l2_set_subdevdata(&this->sd, client); v4l2_set_subdevdata(&this->sd, client);
rval = media_entity_init(&this->sd.entity, rval = media_entity_init(&this->sd.entity,
......
...@@ -1091,6 +1091,7 @@ static int cx18_probe(struct pci_dev *pci_dev, ...@@ -1091,6 +1091,7 @@ static int cx18_probe(struct pci_dev *pci_dev,
setup.addr = ADDR_UNSET; setup.addr = ADDR_UNSET;
setup.type = cx->options.tuner; setup.type = cx->options.tuner;
setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */ setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */
setup.config = NULL;
if (cx->options.radio > 0) if (cx->options.radio > 0)
setup.mode_mask |= T_RADIO; setup.mode_mask |= T_RADIO;
setup.tuner_callback = (setup.type == TUNER_XC2028) ? setup.tuner_callback = (setup.type == TUNER_XC2028) ?
......
...@@ -396,6 +396,7 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, ...@@ -396,6 +396,7 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe,
struct i2c_adapter *i2c_adap, u8 i2c_addr, u8 config) struct i2c_adapter *i2c_adap, u8 i2c_addr, u8 config)
{ {
struct it913x_state *state = NULL; struct it913x_state *state = NULL;
int ret;
/* allocate memory for the internal state */ /* allocate memory for the internal state */
state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL); state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL);
...@@ -425,6 +426,11 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe, ...@@ -425,6 +426,11 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe,
state->tuner_type = config; state->tuner_type = config;
state->firmware_ver = 1; state->firmware_ver = 1;
/* tuner RF initial */
ret = it913x_wr_reg(state, PRO_DMOD, 0xec4c, 0x68);
if (ret < 0)
goto error;
fe->tuner_priv = state; fe->tuner_priv = state;
memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops, memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops,
sizeof(struct dvb_tuner_ops)); sizeof(struct dvb_tuner_ops));
......
...@@ -1575,6 +1575,10 @@ static const struct usb_device_id af9035_id_table[] = { ...@@ -1575,6 +1575,10 @@ static const struct usb_device_id af9035_id_table[] = {
&af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) }, &af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
{ DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900, { DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900,
&af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) }, &af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) },
{ DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_78E,
&af9035_props, "PCTV 78e", RC_MAP_IT913X_V1) },
{ DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_79E,
&af9035_props, "PCTV 79e", RC_MAP_IT913X_V2) },
{ } { }
}; };
MODULE_DEVICE_TABLE(usb, af9035_id_table); MODULE_DEVICE_TABLE(usb, af9035_id_table);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment