提交 ae04e1ca 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
 "For:
   - some regression fixes at the Remote Controller core and imon driver
   - a build fix for certain randconfigs with ir-hix5hd2
   - don't feed power to satellite system at ds3000 driver init

  It also contains some fixes for drivers added for Kernel 3.18:
   - some fixes at the new ISDB-S driver, and the corresponding bits to
     fix some descriptors for this Japanese TV standard at the DVB core
   - two warning cleanups for sp2 driver if PM is disabled
   - change the default mode for the new vivid driver"

* git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  [media] sp2: sp2_init() can be static
  [media] dvb:tc90522: fix always-false expression
  [media] dvb-core: set default properties of ISDB-S
  [media] dvb:tc90522: fix stats report
  [media] vivid: default to single planar device instances
  [media] imon: fix other RC type protocol support
  [media] ir-hix5hd2 fix build warning
  [media] ds3000: fix LNB supply voltage on Tevii S480 on initialization
  [media] rc5-decoder: BZ#85721: Fix RC5-SZ decoding
  [media] rc-core: fix protocol_change regression in ir_raw_event_register
...@@ -221,12 +221,11 @@ ccs_out_mode: specify the allowed video output crop/compose/scaling combination ...@@ -221,12 +221,11 @@ ccs_out_mode: specify the allowed video output crop/compose/scaling combination
key, not quality. key, not quality.
multiplanar: select whether each device instance supports multi-planar formats, multiplanar: select whether each device instance supports multi-planar formats,
and thus the V4L2 multi-planar API. By default the first device instance and thus the V4L2 multi-planar API. By default device instances are
is single-planar, the second multi-planar, and it keeps alternating. single-planar.
This module option can override that for each instance. Values are: This module option can override that for each instance. Values are:
0: use alternating single and multi-planar devices.
1: this is a single-planar instance. 1: this is a single-planar instance.
2: this is a multi-planar instance. 2: this is a multi-planar instance.
...@@ -975,9 +974,8 @@ is set, then the alpha component is only used for the color red and set to ...@@ -975,9 +974,8 @@ is set, then the alpha component is only used for the color red and set to
0 otherwise. 0 otherwise.
The driver has to be configured to support the multiplanar formats. By default The driver has to be configured to support the multiplanar formats. By default
the first driver instance is single-planar, the second is multi-planar, and it the driver instances are single-planar. This can be changed by setting the
keeps alternating. This can be changed by setting the multiplanar module option, multiplanar module option, see section 1 for more details on that option.
see section 1 for more details on that option.
If the driver instance is using the multiplanar formats/API, then the first If the driver instance is using the multiplanar formats/API, then the first
single planar format (YUYV) and the multiplanar NV16M and NV61M formats the single planar format (YUYV) and the multiplanar NV16M and NV61M formats the
...@@ -1021,7 +1019,7 @@ the output overlay for the video output, turn on video looping and capture ...@@ -1021,7 +1019,7 @@ the output overlay for the video output, turn on video looping and capture
to see the blended framebuffer overlay that's being written to by the second to see the blended framebuffer overlay that's being written to by the second
instance. This setup would require the following commands: instance. This setup would require the following commands:
$ sudo modprobe vivid n_devs=2 node_types=0x10101,0x1 multiplanar=1,1 $ sudo modprobe vivid n_devs=2 node_types=0x10101,0x1
$ v4l2-ctl -d1 --find-fb $ v4l2-ctl -d1 --find-fb
/dev/fb1 is the framebuffer associated with base address 0x12800000 /dev/fb1 is the framebuffer associated with base address 0x12800000
$ sudo v4l2-ctl -d2 --set-fbuf fb=1 $ sudo v4l2-ctl -d2 --set-fbuf fb=1
......
...@@ -962,6 +962,11 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe) ...@@ -962,6 +962,11 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
case SYS_ATSC: case SYS_ATSC:
c->modulation = VSB_8; c->modulation = VSB_8;
break; break;
case SYS_ISDBS:
c->symbol_rate = 28860000;
c->rolloff = ROLLOFF_35;
c->bandwidth_hz = c->symbol_rate / 100 * 135;
break;
default: default:
c->modulation = QAM_AUTO; c->modulation = QAM_AUTO;
break; break;
...@@ -2072,6 +2077,7 @@ static int dtv_set_frontend(struct dvb_frontend *fe) ...@@ -2072,6 +2077,7 @@ static int dtv_set_frontend(struct dvb_frontend *fe)
break; break;
case SYS_DVBS: case SYS_DVBS:
case SYS_TURBO: case SYS_TURBO:
case SYS_ISDBS:
rolloff = 135; rolloff = 135;
break; break;
case SYS_DVBS2: case SYS_DVBS2:
......
...@@ -864,6 +864,13 @@ struct dvb_frontend *ds3000_attach(const struct ds3000_config *config, ...@@ -864,6 +864,13 @@ struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
memcpy(&state->frontend.ops, &ds3000_ops, memcpy(&state->frontend.ops, &ds3000_ops,
sizeof(struct dvb_frontend_ops)); sizeof(struct dvb_frontend_ops));
state->frontend.demodulator_priv = state; state->frontend.demodulator_priv = state;
/*
* Some devices like T480 starts with voltage on. Be sure
* to turn voltage off during init, as this can otherwise
* interfere with Unicable SCR systems.
*/
ds3000_set_voltage(&state->frontend, SEC_VOLTAGE_OFF);
return &state->frontend; return &state->frontend;
error3: error3:
......
...@@ -266,7 +266,7 @@ int sp2_ci_poll_slot_status(struct dvb_ca_en50221 *en50221, ...@@ -266,7 +266,7 @@ int sp2_ci_poll_slot_status(struct dvb_ca_en50221 *en50221,
return s->status; return s->status;
} }
int sp2_init(struct sp2 *s) static int sp2_init(struct sp2 *s)
{ {
int ret = 0; int ret = 0;
u8 buf; u8 buf;
...@@ -348,7 +348,7 @@ int sp2_init(struct sp2 *s) ...@@ -348,7 +348,7 @@ int sp2_init(struct sp2 *s)
return ret; return ret;
} }
int sp2_exit(struct i2c_client *client) static int sp2_exit(struct i2c_client *client)
{ {
struct sp2 *s; struct sp2 *s;
......
...@@ -216,32 +216,30 @@ static int tc90522s_get_frontend(struct dvb_frontend *fe) ...@@ -216,32 +216,30 @@ static int tc90522s_get_frontend(struct dvb_frontend *fe)
c->delivery_system = SYS_ISDBS; c->delivery_system = SYS_ISDBS;
layers = 0; layers = 0;
ret = reg_read(state, 0xe8, val, 3); ret = reg_read(state, 0xe6, val, 5);
if (ret == 0) { if (ret == 0) {
int slots;
u8 v; u8 v;
c->stream_id = val[0] << 8 | val[1];
/* high/single layer */ /* high/single layer */
v = (val[0] & 0x70) >> 4; v = (val[2] & 0x70) >> 4;
c->modulation = (v == 7) ? PSK_8 : QPSK; c->modulation = (v == 7) ? PSK_8 : QPSK;
c->fec_inner = fec_conv_sat[v]; c->fec_inner = fec_conv_sat[v];
c->layer[0].fec = c->fec_inner; c->layer[0].fec = c->fec_inner;
c->layer[0].modulation = c->modulation; c->layer[0].modulation = c->modulation;
c->layer[0].segment_count = val[1] & 0x3f; /* slots */ c->layer[0].segment_count = val[3] & 0x3f; /* slots */
/* low layer */ /* low layer */
v = (val[0] & 0x07); v = (val[2] & 0x07);
c->layer[1].fec = fec_conv_sat[v]; c->layer[1].fec = fec_conv_sat[v];
if (v == 0) /* no low layer */ if (v == 0) /* no low layer */
c->layer[1].segment_count = 0; c->layer[1].segment_count = 0;
else else
c->layer[1].segment_count = val[2] & 0x3f; /* slots */ c->layer[1].segment_count = val[4] & 0x3f; /* slots */
/* actually, BPSK if v==1, but not defined in fe_modulation_t */ /* actually, BPSK if v==1, but not defined in fe_modulation_t */
c->layer[1].modulation = QPSK; c->layer[1].modulation = QPSK;
layers = (v > 0) ? 2 : 1; layers = (v > 0) ? 2 : 1;
slots = c->layer[0].segment_count + c->layer[1].segment_count;
c->symbol_rate = 28860000 * slots / 48;
} }
/* statistics */ /* statistics */
...@@ -363,7 +361,7 @@ static int tc90522t_get_frontend(struct dvb_frontend *fe) ...@@ -363,7 +361,7 @@ static int tc90522t_get_frontend(struct dvb_frontend *fe)
u8 v; u8 v;
c->isdbt_partial_reception = val[0] & 0x01; c->isdbt_partial_reception = val[0] & 0x01;
c->isdbt_sb_mode = (val[0] & 0xc0) == 0x01; c->isdbt_sb_mode = (val[0] & 0xc0) == 0x40;
/* layer A */ /* layer A */
v = (val[2] & 0x78) >> 3; v = (val[2] & 0x78) >> 3;
......
...@@ -100,11 +100,9 @@ MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n" ...@@ -100,11 +100,9 @@ MODULE_PARM_DESC(ccs_out_mode, " output crop/compose/scale mode:\n"
"\t\t bit 0=crop, 1=compose, 2=scale,\n" "\t\t bit 0=crop, 1=compose, 2=scale,\n"
"\t\t -1=user-controlled (default)"); "\t\t -1=user-controlled (default)");
static unsigned multiplanar[VIVID_MAX_DEVS]; static unsigned multiplanar[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 1 };
module_param_array(multiplanar, uint, NULL, 0444); module_param_array(multiplanar, uint, NULL, 0444);
MODULE_PARM_DESC(multiplanar, " 0 (default) is alternating single and multiplanar devices,\n" MODULE_PARM_DESC(multiplanar, " 1 (default) creates a single planar device, 2 creates a multiplanar device.");
"\t\t 1 is single planar devices,\n"
"\t\t 2 is multiplanar devices");
/* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */ /* Default: video + vbi-cap (raw and sliced) + radio rx + radio tx + sdr + vbi-out + vid-out */
static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d }; static unsigned node_types[VIVID_MAX_DEVS] = { [0 ... (VIVID_MAX_DEVS - 1)] = 0x1d3d };
...@@ -669,10 +667,7 @@ static int __init vivid_create_instance(int inst) ...@@ -669,10 +667,7 @@ static int __init vivid_create_instance(int inst)
/* start detecting feature set */ /* start detecting feature set */
/* do we use single- or multi-planar? */ /* do we use single- or multi-planar? */
if (multiplanar[inst] == 0) dev->multiplanar = multiplanar[inst] > 1;
dev->multiplanar = inst & 1;
else
dev->multiplanar = multiplanar[inst] > 1;
v4l2_info(&dev->v4l2_dev, "using %splanar format API\n", v4l2_info(&dev->v4l2_dev, "using %splanar format API\n",
dev->multiplanar ? "multi" : "single "); dev->multiplanar ? "multi" : "single ");
......
...@@ -1678,7 +1678,8 @@ static void imon_incoming_packet(struct imon_context *ictx, ...@@ -1678,7 +1678,8 @@ static void imon_incoming_packet(struct imon_context *ictx,
if (press_type == 0) if (press_type == 0)
rc_keyup(ictx->rdev); rc_keyup(ictx->rdev);
else { else {
if (ictx->rc_type == RC_BIT_RC6_MCE) if (ictx->rc_type == RC_BIT_RC6_MCE ||
ictx->rc_type == RC_BIT_OTHER)
rc_keydown(ictx->rdev, rc_keydown(ictx->rdev,
ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER, ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER,
ictx->rc_scancode, ictx->rc_toggle); ictx->rc_scancode, ictx->rc_toggle);
......
...@@ -297,7 +297,7 @@ static int hix5hd2_ir_remove(struct platform_device *pdev) ...@@ -297,7 +297,7 @@ static int hix5hd2_ir_remove(struct platform_device *pdev)
return 0; return 0;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM_SLEEP
static int hix5hd2_ir_suspend(struct device *dev) static int hix5hd2_ir_suspend(struct device *dev)
{ {
struct hix5hd2_ir_priv *priv = dev_get_drvdata(dev); struct hix5hd2_ir_priv *priv = dev_get_drvdata(dev);
......
...@@ -53,7 +53,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -53,7 +53,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
u32 scancode; u32 scancode;
enum rc_type protocol; enum rc_type protocol;
if (!(dev->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X))) if (!(dev->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X | RC_BIT_RC5_SZ)))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -262,7 +262,6 @@ int ir_raw_event_register(struct rc_dev *dev) ...@@ -262,7 +262,6 @@ int ir_raw_event_register(struct rc_dev *dev)
return -ENOMEM; return -ENOMEM;
dev->raw->dev = dev; dev->raw->dev = dev;
dev->enabled_protocols = ~0;
dev->change_protocol = change_protocol; dev->change_protocol = change_protocol;
rc = kfifo_alloc(&dev->raw->kfifo, rc = kfifo_alloc(&dev->raw->kfifo,
sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE, sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
......
...@@ -1421,6 +1421,8 @@ int rc_register_device(struct rc_dev *dev) ...@@ -1421,6 +1421,8 @@ int rc_register_device(struct rc_dev *dev)
if (dev->change_protocol) { if (dev->change_protocol) {
u64 rc_type = (1 << rc_map->rc_type); u64 rc_type = (1 << rc_map->rc_type);
if (dev->driver_type == RC_DRIVER_IR_RAW)
rc_type |= RC_BIT_LIRC;
rc = dev->change_protocol(dev, &rc_type); rc = dev->change_protocol(dev, &rc_type);
if (rc < 0) if (rc < 0)
goto out_raw; goto out_raw;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册