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

Commit 579d3152 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB (12244): em28xx: adjust vinmode/vinctl based on the stream input format



Depending on the video input format, vinmode/vinctl needs adjustments.
For TV, this is not relevant, since the supported decoders output data
at the same format. However, webcam sensors may have different formats,
so, this needs to be adjusted based on the device.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent d36bb4e7
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -1735,6 +1735,11 @@ static int em28xx_hint_sensor(struct em28xx *dev)
		dev->sensor_xres = 640;
		dev->sensor_xres = 640;
		dev->sensor_yres = 480;
		dev->sensor_yres = 480;
		dev->sensor_xtal = 6300000;
		dev->sensor_xtal = 6300000;

		/* probably means GRGB 16 bit bayer */
		dev->vinmode = 0x0d;
		dev->vinctl = 0x00;

		break;
		break;
	default:
	default:
		printk("Unknown Micron Sensor 0x%04x\n", be16_to_cpu(version));
		printk("Unknown Micron Sensor 0x%04x\n", be16_to_cpu(version));
@@ -2414,6 +2419,12 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
		return errCode;
		return errCode;
	}
	}


	/*
	 * Default format, used for tvp5150 or saa711x output formats
	 */
	dev->vinmode = 0x10;
	dev->vinctl  = 0x11;

	/*
	/*
	 * If the device can be a webcam, seek for a sensor.
	 * If the device can be a webcam, seek for a sensor.
	 * If sensor is not found, then it isn't a webcam.
	 * If sensor is not found, then it isn't a webcam.
+3 −14
Original line number Original line Diff line number Diff line
@@ -648,28 +648,17 @@ int em28xx_capture_start(struct em28xx *dev, int start)
int em28xx_set_outfmt(struct em28xx *dev)
int em28xx_set_outfmt(struct em28xx *dev)
{
{
	int ret;
	int ret;
	int vinmode, vinctl, outfmt;

	outfmt  = dev->format->reg;

	if (dev->board.is_webcam) {
		vinmode = 0x0d;
		vinctl  = 0x00;
	} else {
		vinmode = 0x10;
		vinctl  = 0x11;
	}


	ret = em28xx_write_reg_bits(dev, EM28XX_R27_OUTFMT,
	ret = em28xx_write_reg_bits(dev, EM28XX_R27_OUTFMT,
				outfmt | 0x20, 0xff);
				dev->format->reg | 0x20, 0xff);
	if (ret < 0)
	if (ret < 0)
			return ret;
			return ret;


	ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, vinmode);
	ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, dev->vinmode);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	return em28xx_write_reg(dev, EM28XX_R11_VINCTRL, vinctl);
	return em28xx_write_reg(dev, EM28XX_R11_VINCTRL, dev->vinctl);
}
}


static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
+3 −0
Original line number Original line Diff line number Diff line
@@ -483,6 +483,9 @@ struct em28xx {
	int sensor_xres, sensor_yres;
	int sensor_xres, sensor_yres;
	int sensor_xtal;
	int sensor_xtal;


	/* Vinmode/Vinctl used at the driver */
	int vinmode, vinctl;

	unsigned int stream_on:1;	/* Locks streams */
	unsigned int stream_on:1;	/* Locks streams */
	unsigned int has_audio_class:1;
	unsigned int has_audio_class:1;
	unsigned int has_alsa_audio:1;
	unsigned int has_alsa_audio:1;