Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e98092be authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents 971316f0 fda27874
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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.

+22 −4
Original line number Diff line number Diff line
@@ -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 @@ static struct imon_context *imon_init_intf1(struct usb_interface *intf,
	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;
}
+15 −3
Original line number Diff line number Diff line
@@ -154,10 +154,20 @@ static int device_authorization(struct hdpvr_device *dev)
	}
#endif

	dev->fw_ver = dev->usbc_buf[1];

	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[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->usbc_buf[1]) {
	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,
+33 −13
Original line number Diff line number Diff line
@@ -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,10 +723,24 @@ 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);
@@ -737,6 +752,10 @@ static int fill_queryctrl(struct hdpvr_options *opt, struct v4l2_queryctrl *qc,
			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_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;
+1 −0
Original line number Diff line number Diff line
@@ -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)
Loading