mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-18 07:27:20 +00:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: [media] hdpvr: update picture controls to support firmware versions > 0.15 [media] wl128x: fix build errors when GPIOLIB is not enabled [media] hdpvr: fix race conditon during start of streaming [media] omap3isp: Fix crash caused by subdevs now having a pointer to devnodes [media] imon: don't wedge hardware after early callbacks
This commit is contained in:
commit
e98092bedc
@ -4,8 +4,8 @@
|
||||
menu "Texas Instruments WL128x FM driver (ST based)"
|
||||
config RADIO_WL128X
|
||||
tristate "Texas Instruments WL128x FM Radio"
|
||||
depends on VIDEO_V4L2 && RFKILL
|
||||
select TI_ST if NET && GPIOLIB
|
||||
depends on VIDEO_V4L2 && RFKILL && GPIOLIB
|
||||
select TI_ST if NET
|
||||
help
|
||||
Choose Y here if you have this FM radio chip.
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
||||
#define MOD_AUTHOR "Jarod Wilson <jarod@wilsonet.com>"
|
||||
#define MOD_DESC "Driver for SoundGraph iMON MultiMedia IR/Display"
|
||||
#define MOD_NAME "imon"
|
||||
#define MOD_VERSION "0.9.3"
|
||||
#define MOD_VERSION "0.9.4"
|
||||
|
||||
#define DISPLAY_MINOR_BASE 144
|
||||
#define DEVICE_NAME "lcd%d"
|
||||
@ -1658,9 +1658,17 @@ static void usb_rx_callback_intf0(struct urb *urb)
|
||||
return;
|
||||
|
||||
ictx = (struct imon_context *)urb->context;
|
||||
if (!ictx || !ictx->dev_present_intf0)
|
||||
if (!ictx)
|
||||
return;
|
||||
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (!ictx->dev_present_intf0)
|
||||
goto out;
|
||||
|
||||
switch (urb->status) {
|
||||
case -ENOENT: /* usbcore unlink successful! */
|
||||
return;
|
||||
@ -1678,6 +1686,7 @@ static void usb_rx_callback_intf0(struct urb *urb)
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
@ -1690,9 +1699,17 @@ static void usb_rx_callback_intf1(struct urb *urb)
|
||||
return;
|
||||
|
||||
ictx = (struct imon_context *)urb->context;
|
||||
if (!ictx || !ictx->dev_present_intf1)
|
||||
if (!ictx)
|
||||
return;
|
||||
|
||||
/*
|
||||
* if we get a callback before we're done configuring the hardware, we
|
||||
* can't yet process the data, as there's nowhere to send it, but we
|
||||
* still need to submit a new rx URB to avoid wedging the hardware
|
||||
*/
|
||||
if (!ictx->dev_present_intf1)
|
||||
goto out;
|
||||
|
||||
switch (urb->status) {
|
||||
case -ENOENT: /* usbcore unlink successful! */
|
||||
return;
|
||||
@ -1710,6 +1727,7 @@ static void usb_rx_callback_intf1(struct urb *urb)
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
@ -2242,7 +2260,7 @@ find_endpoint_failed:
|
||||
mutex_unlock(&ictx->lock);
|
||||
usb_free_urb(rx_urb);
|
||||
rx_urb_alloc_failed:
|
||||
dev_err(ictx->dev, "unable to initialize intf0, err %d\n", ret);
|
||||
dev_err(ictx->dev, "unable to initialize intf1, err %d\n", ret);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
|
||||
dev->usbc_buf[1], &dev->usbc_buf[2]);
|
||||
dev->fw_ver = dev->usbc_buf[1];
|
||||
|
||||
switch (dev->usbc_buf[1]) {
|
||||
v4l2_info(&dev->v4l2_dev, "firmware version 0x%x dated %s\n",
|
||||
dev->fw_ver, &dev->usbc_buf[2]);
|
||||
|
||||
if (dev->fw_ver > 0x15) {
|
||||
dev->options.brightness = 0x80;
|
||||
dev->options.contrast = 0x40;
|
||||
dev->options.hue = 0xf;
|
||||
dev->options.saturation = 0x40;
|
||||
dev->options.sharpness = 0x80;
|
||||
}
|
||||
|
||||
switch (dev->fw_ver) {
|
||||
case HDPVR_FIRMWARE_VERSION:
|
||||
dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
break;
|
||||
@ -169,7 +179,7 @@ static int device_authorization(struct hdpvr_device *dev)
|
||||
default:
|
||||
v4l2_info(&dev->v4l2_dev, "untested firmware, the driver might"
|
||||
" not work.\n");
|
||||
if (dev->usbc_buf[1] >= HDPVR_FIRMWARE_VERSION_AC3)
|
||||
if (dev->fw_ver >= HDPVR_FIRMWARE_VERSION_AC3)
|
||||
dev->flags |= HDPVR_FLAG_AC3_CAP;
|
||||
else
|
||||
dev->flags &= ~HDPVR_FLAG_AC3_CAP;
|
||||
@ -270,6 +280,8 @@ static const struct hdpvr_options hdpvr_default_options = {
|
||||
.bitrate_mode = HDPVR_CONSTANT,
|
||||
.gop_mode = HDPVR_SIMPLE_IDR_GOP,
|
||||
.audio_codec = V4L2_MPEG_AUDIO_ENCODING_AAC,
|
||||
/* original picture controls for firmware version <= 0x15 */
|
||||
/* updated in device_authorization() for newer firmware */
|
||||
.brightness = 0x86,
|
||||
.contrast = 0x80,
|
||||
.hue = 0x80,
|
||||
|
@ -283,12 +283,13 @@ static int hdpvr_start_streaming(struct hdpvr_device *dev)
|
||||
|
||||
hdpvr_config_call(dev, CTRL_START_STREAMING_VALUE, 0x00);
|
||||
|
||||
dev->status = STATUS_STREAMING;
|
||||
|
||||
INIT_WORK(&dev->worker, hdpvr_transmit_buffers);
|
||||
queue_work(dev->workqueue, &dev->worker);
|
||||
|
||||
v4l2_dbg(MSG_BUFFER, hdpvr_debug, &dev->v4l2_dev,
|
||||
"streaming started\n");
|
||||
dev->status = STATUS_STREAMING;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -722,21 +723,39 @@ static const s32 supported_v4l2_ctrls[] = {
|
||||
};
|
||||
|
||||
static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc,
|
||||
int ac3)
|
||||
int ac3, int fw_ver)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (fw_ver > 0x15) {
|
||||
switch (qc->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_CONTRAST:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40);
|
||||
case V4L2_CID_SATURATION:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x40);
|
||||
case V4L2_CID_HUE:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0x1e, 1, 0xf);
|
||||
case V4L2_CID_SHARPNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
}
|
||||
} else {
|
||||
switch (qc->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86);
|
||||
case V4L2_CID_CONTRAST:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_SATURATION:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_HUE:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_SHARPNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
}
|
||||
}
|
||||
|
||||
switch (qc->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x86);
|
||||
case V4L2_CID_CONTRAST:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_SATURATION:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_HUE:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_SHARPNESS:
|
||||
return v4l2_ctrl_query_fill(qc, 0x0, 0xff, 1, 0x80);
|
||||
case V4L2_CID_MPEG_AUDIO_ENCODING:
|
||||
return v4l2_ctrl_query_fill(
|
||||
qc, V4L2_MPEG_AUDIO_ENCODING_AAC,
|
||||
@ -794,7 +813,8 @@ static int vidioc_queryctrl(struct file *file, void *private_data,
|
||||
|
||||
if (qc->id == supported_v4l2_ctrls[i])
|
||||
return fill_queryctrl(&dev->options, qc,
|
||||
dev->flags & HDPVR_FLAG_AC3_CAP);
|
||||
dev->flags & HDPVR_FLAG_AC3_CAP,
|
||||
dev->fw_ver);
|
||||
|
||||
if (qc->id < supported_v4l2_ctrls[i])
|
||||
break;
|
||||
|
@ -113,6 +113,7 @@ struct hdpvr_device {
|
||||
/* usb control transfer buffer and lock */
|
||||
struct mutex usbc_mutex;
|
||||
u8 *usbc_buf;
|
||||
u8 fw_ver;
|
||||
};
|
||||
|
||||
static inline struct hdpvr_device *to_hdpvr_dev(struct v4l2_device *v4l2_dev)
|
||||
|
@ -1407,7 +1407,7 @@ static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event)
|
||||
static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc)
|
||||
{
|
||||
struct isp_pipeline *pipe = to_isp_pipeline(&ccdc->subdev.entity);
|
||||
struct video_device *vdev = &ccdc->subdev.devnode;
|
||||
struct video_device *vdev = ccdc->subdev.devnode;
|
||||
struct v4l2_event event;
|
||||
|
||||
memset(&event, 0, sizeof(event));
|
||||
|
Loading…
x
Reference in New Issue
Block a user