Merge tag 'media/v3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - Two new dvb frontend drivers: mn88472 and mn88473 - A new driver for some PCIe DVBSky cards - A new remote controller driver: meson-ir - One LIRC staging driver got rewritten and promoted to mainstream: igorplugusb - A new tuner driver (m88rs6000t) - The old omap2 media driver got removed from staging. This driver uses an old DMA API and it is likely broken on recent kernels. Nobody cared enough to fix it - Media bus format moved to a separate header, as DRM will also use the definitions there - mem2mem_testdev were renamed to vim2m, in order to use the same naming convention taken by the other virtual test driver (vivid) - Added a new driver for coda SoC (coda-jpeg) - The cx88 driver got converted to use videobuf2 core - Make DMABUF export buffer to work with DMA Scatter/Gather and Vmalloc cores - Lots of other fixes, improvements and cleanups on the drivers. * tag 'media/v3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (384 commits) [media] mn88473: One function call less in mn88473_init() after error [media] mn88473: Remove uneeded check before release_firmware() [media] lirc_zilog: Deletion of unnecessary checks before vfree() [media] MAINTAINERS: Add myself as img-ir maintainer [media] img-ir: Don't set driver's module owner [media] img-ir: Depend on METAG or MIPS or COMPILE_TEST [media] img-ir/hw: Drop [un]register_decoder declarations [media] img-ir/hw: Fix potential deadlock stopping timer [media] img-ir/hw: Always read data to clear buffer [media] redrat3: ensure dma is setup properly [media] ddbridge: remove unneeded check before dvb_unregister_device() [media] si2157: One function call less in si2157_init() after error [media] tuners: remove uneeded checks before release_firmware() [media] arm: omap2: rx51-peripherals: fix build warning [media] stv090x: add an extra protetion against buffer overflow [media] stv090x: Remove an unreachable code [media] stv090x: Some whitespace cleanups [media] em28xx: checkpatch cleanup: whitespaces/new lines cleanups [media] si2168: add support for firmware files in new format [media] si2168: debug printout for firmware version ...
This commit is contained in:
@@ -63,9 +63,9 @@ static inline struct adv7170 *to_adv7170(struct v4l2_subdev *sd)
|
||||
|
||||
static char *inputs[] = { "pass_through", "play_back" };
|
||||
|
||||
static enum v4l2_mbus_pixelcode adv7170_codes[] = {
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_1X16,
|
||||
static u32 adv7170_codes[] = {
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_1X16,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
@@ -263,7 +263,7 @@ static int adv7170_s_routing(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int adv7170_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(adv7170_codes))
|
||||
return -EINVAL;
|
||||
@@ -278,9 +278,9 @@ static int adv7170_g_fmt(struct v4l2_subdev *sd,
|
||||
u8 val = adv7170_read(sd, 0x7);
|
||||
|
||||
if ((val & 0x40) == (1 << 6))
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
else
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
mf->width = 0;
|
||||
@@ -297,11 +297,11 @@ static int adv7170_s_fmt(struct v4l2_subdev *sd,
|
||||
int ret;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
val &= ~0x40;
|
||||
break;
|
||||
|
||||
case V4L2_MBUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
val |= 0x40;
|
||||
break;
|
||||
|
||||
|
@@ -60,9 +60,9 @@ static inline struct adv7175 *to_adv7175(struct v4l2_subdev *sd)
|
||||
|
||||
static char *inputs[] = { "pass_through", "play_back", "color_bar" };
|
||||
|
||||
static enum v4l2_mbus_pixelcode adv7175_codes[] = {
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_1X16,
|
||||
static u32 adv7175_codes[] = {
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_1X16,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
@@ -301,7 +301,7 @@ static int adv7175_s_routing(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int adv7175_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(adv7175_codes))
|
||||
return -EINVAL;
|
||||
@@ -316,9 +316,9 @@ static int adv7175_g_fmt(struct v4l2_subdev *sd,
|
||||
u8 val = adv7175_read(sd, 0x7);
|
||||
|
||||
if ((val & 0x40) == (1 << 6))
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_1X16;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
else
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
mf->width = 0;
|
||||
@@ -335,11 +335,11 @@ static int adv7175_s_fmt(struct v4l2_subdev *sd,
|
||||
int ret;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
val &= ~0x40;
|
||||
break;
|
||||
|
||||
case V4L2_MBUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
val |= 0x40;
|
||||
break;
|
||||
|
||||
|
@@ -422,12 +422,12 @@ static void adv7180_exit_controls(struct adv7180_state *state)
|
||||
}
|
||||
|
||||
static int adv7180_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -437,7 +437,7 @@ static int adv7180_mbus_fmt(struct v4l2_subdev *sd,
|
||||
{
|
||||
struct adv7180_state *state = to_state(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
fmt->width = 720;
|
||||
|
@@ -421,12 +421,12 @@ static int adv7183_g_input_status(struct v4l2_subdev *sd, u32 *status)
|
||||
}
|
||||
|
||||
static int adv7183_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
*code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -435,7 +435,7 @@ static int adv7183_try_mbus_fmt(struct v4l2_subdev *sd,
|
||||
{
|
||||
struct adv7183 *decoder = to_adv7183(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
if (decoder->std & V4L2_STD_525_60) {
|
||||
fmt->field = V4L2_FIELD_SEQ_TB;
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/hdmi.h>
|
||||
#include <linux/v4l2-dv-timings.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-common.h>
|
||||
@@ -96,6 +97,10 @@ struct adv7511_state {
|
||||
bool have_monitor;
|
||||
/* timings from s_dv_timings */
|
||||
struct v4l2_dv_timings dv_timings;
|
||||
u32 fmt_code;
|
||||
u32 colorspace;
|
||||
u32 ycbcr_enc;
|
||||
u32 quantization;
|
||||
/* controls */
|
||||
struct v4l2_ctrl *hdmi_mode_ctrl;
|
||||
struct v4l2_ctrl *hotplug_ctrl;
|
||||
@@ -779,26 +784,234 @@ static int adv7511_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
if (edid->pad != 0)
|
||||
return -EINVAL;
|
||||
if ((edid->blocks == 0) || (edid->blocks > 256))
|
||||
return -EINVAL;
|
||||
if (!state->edid.segments) {
|
||||
v4l2_dbg(1, debug, sd, "EDID segment 0 not found\n");
|
||||
return -ENODATA;
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = state->edid.segments * 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (state->edid.segments == 0)
|
||||
return -ENODATA;
|
||||
|
||||
if (edid->start_block >= state->edid.segments * 2)
|
||||
return -E2BIG;
|
||||
if ((edid->blocks + edid->start_block) >= state->edid.segments * 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > state->edid.segments * 2)
|
||||
edid->blocks = state->edid.segments * 2 - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, &state->edid.data[edid->start_block * 128],
|
||||
128 * edid->blocks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adv7511_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_mbus_code_enum *code)
|
||||
{
|
||||
if (code->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (code->index) {
|
||||
case 0:
|
||||
code->code = MEDIA_BUS_FMT_RGB888_1X24;
|
||||
break;
|
||||
case 1:
|
||||
code->code = MEDIA_BUS_FMT_YUYV8_1X16;
|
||||
break;
|
||||
case 2:
|
||||
code->code = MEDIA_BUS_FMT_UYVY8_1X16;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adv7511_fill_format(struct adv7511_state *state,
|
||||
struct v4l2_mbus_framefmt *format)
|
||||
{
|
||||
memset(format, 0, sizeof(*format));
|
||||
|
||||
format->width = state->dv_timings.bt.width;
|
||||
format->height = state->dv_timings.bt.height;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
}
|
||||
|
||||
static int adv7511_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
|
||||
if (format->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
adv7511_fill_format(state, &format->format);
|
||||
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
struct v4l2_mbus_framefmt *fmt;
|
||||
|
||||
fmt = v4l2_subdev_get_try_format(fh, format->pad);
|
||||
format->format.code = fmt->code;
|
||||
format->format.colorspace = fmt->colorspace;
|
||||
format->format.ycbcr_enc = fmt->ycbcr_enc;
|
||||
format->format.quantization = fmt->quantization;
|
||||
} else {
|
||||
format->format.code = state->fmt_code;
|
||||
format->format.colorspace = state->colorspace;
|
||||
format->format.ycbcr_enc = state->ycbcr_enc;
|
||||
format->format.quantization = state->quantization;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int adv7511_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *format)
|
||||
{
|
||||
struct adv7511_state *state = get_adv7511_state(sd);
|
||||
/*
|
||||
* Bitfield namings come the CEA-861-F standard, table 8 "Auxiliary
|
||||
* Video Information (AVI) InfoFrame Format"
|
||||
*
|
||||
* c = Colorimetry
|
||||
* ec = Extended Colorimetry
|
||||
* y = RGB or YCbCr
|
||||
* q = RGB Quantization Range
|
||||
* yq = YCC Quantization Range
|
||||
*/
|
||||
u8 c = HDMI_COLORIMETRY_NONE;
|
||||
u8 ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
u8 y = HDMI_COLORSPACE_RGB;
|
||||
u8 q = HDMI_QUANTIZATION_RANGE_DEFAULT;
|
||||
u8 yq = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
|
||||
if (format->pad != 0)
|
||||
return -EINVAL;
|
||||
switch (format->format.code) {
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
case MEDIA_BUS_FMT_RGB888_1X24:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adv7511_fill_format(state, &format->format);
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
struct v4l2_mbus_framefmt *fmt;
|
||||
|
||||
fmt = v4l2_subdev_get_try_format(fh, format->pad);
|
||||
fmt->code = format->format.code;
|
||||
fmt->colorspace = format->format.colorspace;
|
||||
fmt->ycbcr_enc = format->format.ycbcr_enc;
|
||||
fmt->quantization = format->format.quantization;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (format->format.code) {
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x01);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0xb8);
|
||||
y = HDMI_COLORSPACE_YUV422;
|
||||
break;
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x01);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0xbc);
|
||||
y = HDMI_COLORSPACE_YUV422;
|
||||
break;
|
||||
case MEDIA_BUS_FMT_RGB888_1X24:
|
||||
default:
|
||||
adv7511_wr_and_or(sd, 0x15, 0xf0, 0x00);
|
||||
adv7511_wr_and_or(sd, 0x16, 0x03, 0x00);
|
||||
break;
|
||||
}
|
||||
state->fmt_code = format->format.code;
|
||||
state->colorspace = format->format.colorspace;
|
||||
state->ycbcr_enc = format->format.ycbcr_enc;
|
||||
state->quantization = format->format.quantization;
|
||||
|
||||
switch (format->format.colorspace) {
|
||||
case V4L2_COLORSPACE_ADOBERGB:
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = y ? HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601 :
|
||||
HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB;
|
||||
break;
|
||||
case V4L2_COLORSPACE_SMPTE170M:
|
||||
c = y ? HDMI_COLORIMETRY_ITU_601 : HDMI_COLORIMETRY_NONE;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_XV601) {
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
}
|
||||
break;
|
||||
case V4L2_COLORSPACE_REC709:
|
||||
c = y ? HDMI_COLORIMETRY_ITU_709 : HDMI_COLORIMETRY_NONE;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_XV709) {
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
ec = HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
||||
}
|
||||
break;
|
||||
case V4L2_COLORSPACE_SRGB:
|
||||
c = y ? HDMI_COLORIMETRY_EXTENDED : HDMI_COLORIMETRY_NONE;
|
||||
ec = y ? HDMI_EXTENDED_COLORIMETRY_S_YCC_601 :
|
||||
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
||||
break;
|
||||
case V4L2_COLORSPACE_BT2020:
|
||||
c = HDMI_COLORIMETRY_EXTENDED;
|
||||
if (y && format->format.ycbcr_enc == V4L2_YCBCR_ENC_BT2020_CONST_LUM)
|
||||
ec = 5; /* Not yet available in hdmi.h */
|
||||
else
|
||||
ec = 6; /* Not yet available in hdmi.h */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* CEA-861-F says that for RGB formats the YCC range must match the
|
||||
* RGB range, although sources should ignore the YCC range.
|
||||
*
|
||||
* The RGB quantization range shouldn't be non-zero if the EDID doesn't
|
||||
* have the Q bit set in the Video Capabilities Data Block, however this
|
||||
* isn't checked at the moment. The assumption is that the application
|
||||
* knows the EDID and can detect this.
|
||||
*
|
||||
* The same is true for the YCC quantization range: non-standard YCC
|
||||
* quantization ranges should only be sent if the EDID has the YQ bit
|
||||
* set in the Video Capabilities Data Block.
|
||||
*/
|
||||
switch (format->format.quantization) {
|
||||
case V4L2_QUANTIZATION_FULL_RANGE:
|
||||
q = y ? HDMI_QUANTIZATION_RANGE_DEFAULT :
|
||||
HDMI_QUANTIZATION_RANGE_FULL;
|
||||
yq = q ? q - 1 : HDMI_YCC_QUANTIZATION_RANGE_FULL;
|
||||
break;
|
||||
case V4L2_QUANTIZATION_LIM_RANGE:
|
||||
q = y ? HDMI_QUANTIZATION_RANGE_DEFAULT :
|
||||
HDMI_QUANTIZATION_RANGE_LIMITED;
|
||||
yq = q ? q - 1 : HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
|
||||
break;
|
||||
}
|
||||
|
||||
adv7511_wr_and_or(sd, 0x4a, 0xbf, 0);
|
||||
adv7511_wr_and_or(sd, 0x55, 0x9f, y << 5);
|
||||
adv7511_wr_and_or(sd, 0x56, 0x3f, c << 6);
|
||||
adv7511_wr_and_or(sd, 0x57, 0x83, (ec << 4) | (q << 2));
|
||||
adv7511_wr_and_or(sd, 0x59, 0x0f, yq << 4);
|
||||
adv7511_wr_and_or(sd, 0x4a, 0xff, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_subdev_pad_ops adv7511_pad_ops = {
|
||||
.get_edid = adv7511_get_edid,
|
||||
.enum_mbus_code = adv7511_enum_mbus_code,
|
||||
.get_fmt = adv7511_get_fmt,
|
||||
.set_fmt = adv7511_set_fmt,
|
||||
.enum_dv_timings = adv7511_enum_dv_timings,
|
||||
.dv_timings_cap = adv7511_dv_timings_cap,
|
||||
};
|
||||
@@ -1116,6 +1329,8 @@ static int adv7511_probe(struct i2c_client *client, const struct i2c_device_id *
|
||||
return -ENODEV;
|
||||
}
|
||||
memcpy(&state->pdata, pdata, sizeof(state->pdata));
|
||||
state->fmt_code = MEDIA_BUS_FMT_RGB888_1X24;
|
||||
state->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
sd = &state->sd;
|
||||
|
||||
|
@@ -88,7 +88,7 @@ struct adv7604_reg_seq {
|
||||
};
|
||||
|
||||
struct adv7604_format_info {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u8 op_ch_sel;
|
||||
bool rgb_out;
|
||||
bool swap_cb_cr;
|
||||
@@ -749,77 +749,77 @@ static void adv7604_write_reg_seq(struct v4l2_subdev *sd,
|
||||
*/
|
||||
|
||||
static const struct adv7604_format_info adv7604_formats[] = {
|
||||
{ V4L2_MBUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
{ MEDIA_BUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_444 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV10_2X10, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV10_2X10, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU10_2X10, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU10_2X10, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY10_1X20, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY10_1X20, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY10_1X20, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY10_1X20, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV10_1X20, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV10_1X20, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU10_1X20, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU10_1X20, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_10BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
};
|
||||
|
||||
static const struct adv7604_format_info adv7611_formats[] = {
|
||||
{ V4L2_MBUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
{ MEDIA_BUS_FMT_RGB888_1X24, ADV7604_OP_CH_SEL_RGB, true, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_444 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_2X12, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_2X12, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422 | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY8_1X16, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY8_1X16, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV8_1X16, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU8_1X16, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_8BIT },
|
||||
{ V4L2_MBUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
{ MEDIA_BUS_FMT_UYVY12_1X24, ADV7604_OP_CH_SEL_RBG, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
{ MEDIA_BUS_FMT_VYUY12_1X24, ADV7604_OP_CH_SEL_RBG, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
{ MEDIA_BUS_FMT_YUYV12_1X24, ADV7604_OP_CH_SEL_RGB, false, false,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
{ V4L2_MBUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
{ MEDIA_BUS_FMT_YVYU12_1X24, ADV7604_OP_CH_SEL_RGB, false, true,
|
||||
ADV7604_OP_MODE_SEL_SDR_422_2X | ADV7604_OP_FORMAT_SEL_12BIT },
|
||||
};
|
||||
|
||||
static const struct adv7604_format_info *
|
||||
adv7604_format_info(struct adv7604_state *state, enum v4l2_mbus_pixelcode code)
|
||||
adv7604_format_info(struct adv7604_state *state, u32 code)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
@@ -1917,7 +1917,7 @@ static int adv7604_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
|
||||
info = adv7604_format_info(state, format->format.code);
|
||||
if (info == NULL)
|
||||
info = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
|
||||
info = adv7604_format_info(state, MEDIA_BUS_FMT_YUYV8_2X8);
|
||||
|
||||
adv7604_fill_format(state, &format->format);
|
||||
format->format.code = info->code;
|
||||
@@ -1997,19 +1997,7 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
struct adv7604_state *state = to_state(sd);
|
||||
u8 *data = NULL;
|
||||
|
||||
if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
|
||||
return -EINVAL;
|
||||
if (edid->blocks == 0)
|
||||
return -EINVAL;
|
||||
if (edid->blocks > 2)
|
||||
return -EINVAL;
|
||||
if (edid->start_block > 1)
|
||||
return -EINVAL;
|
||||
if (edid->start_block == 1)
|
||||
edid->blocks = 1;
|
||||
|
||||
if (edid->blocks > state->edid.blocks)
|
||||
edid->blocks = state->edid.blocks;
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
switch (edid->pad) {
|
||||
case ADV7604_PAD_HDMI_PORT_A:
|
||||
@@ -2021,14 +2009,24 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (!data)
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = data ? state->edid.blocks : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (data == NULL)
|
||||
return -ENODATA;
|
||||
|
||||
memcpy(edid->edid,
|
||||
data + edid->start_block * 128,
|
||||
edid->blocks * 128);
|
||||
if (edid->start_block >= state->edid.blocks)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > state->edid.blocks)
|
||||
edid->blocks = state->edid.blocks - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, data + edid->start_block * 128, edid->blocks * 128);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2068,6 +2066,8 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
int err;
|
||||
int i;
|
||||
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
|
||||
return -EINVAL;
|
||||
if (edid->start_block != 0)
|
||||
@@ -2164,7 +2164,6 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/* enable hotplug after 100 ms */
|
||||
queue_delayed_work(state->work_queues,
|
||||
&state->delayed_work_enable_hotplug, HZ / 10);
|
||||
@@ -2807,7 +2806,7 @@ static int adv7604_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
state->timings = cea640x480;
|
||||
state->format = adv7604_format_info(state, V4L2_MBUS_FMT_YUYV8_2X8);
|
||||
state->format = adv7604_format_info(state, MEDIA_BUS_FMT_YUYV8_2X8);
|
||||
|
||||
sd = &state->sd;
|
||||
v4l2_i2c_subdev_init(sd, client, &adv7604_ops);
|
||||
|
@@ -1877,12 +1877,12 @@ static int adv7842_s_routing(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int adv7842_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
/* Good enough for now */
|
||||
*code = V4L2_MBUS_FMT_FIXED;
|
||||
*code = MEDIA_BUS_FMT_FIXED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1893,7 +1893,7 @@ static int adv7842_g_mbus_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
fmt->width = state->timings.bt.width;
|
||||
fmt->height = state->timings.bt.height;
|
||||
fmt->code = V4L2_MBUS_FMT_FIXED;
|
||||
fmt->code = MEDIA_BUS_FMT_FIXED;
|
||||
fmt->field = V4L2_FIELD_NONE;
|
||||
|
||||
if (state->mode == ADV7842_MODE_SDP) {
|
||||
@@ -2028,16 +2028,7 @@ static int adv7842_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
struct adv7842_state *state = to_state(sd);
|
||||
u8 *data = NULL;
|
||||
|
||||
if (edid->pad > ADV7842_EDID_PORT_VGA)
|
||||
return -EINVAL;
|
||||
if (edid->blocks == 0)
|
||||
return -EINVAL;
|
||||
if (edid->blocks > 2)
|
||||
return -EINVAL;
|
||||
if (edid->start_block > 1)
|
||||
return -EINVAL;
|
||||
if (edid->start_block == 1)
|
||||
edid->blocks = 1;
|
||||
memset(edid->reserved, 0, sizeof(edid->reserved));
|
||||
|
||||
switch (edid->pad) {
|
||||
case ADV7842_EDID_PORT_A:
|
||||
@@ -2052,12 +2043,23 @@ static int adv7842_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (edid->start_block == 0 && edid->blocks == 0) {
|
||||
edid->blocks = data ? 2 : 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!data)
|
||||
return -ENODATA;
|
||||
|
||||
memcpy(edid->edid,
|
||||
data + edid->start_block * 128,
|
||||
edid->blocks * 128);
|
||||
if (edid->start_block >= 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (edid->start_block + edid->blocks > 2)
|
||||
edid->blocks = 2 - edid->start_block;
|
||||
|
||||
memcpy(edid->edid, data + edid->start_block * 128, edid->blocks * 128);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2066,12 +2068,16 @@ static int adv7842_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *e)
|
||||
struct adv7842_state *state = to_state(sd);
|
||||
int err = 0;
|
||||
|
||||
memset(e->reserved, 0, sizeof(e->reserved));
|
||||
|
||||
if (e->pad > ADV7842_EDID_PORT_VGA)
|
||||
return -EINVAL;
|
||||
if (e->start_block != 0)
|
||||
return -EINVAL;
|
||||
if (e->blocks > 2)
|
||||
if (e->blocks > 2) {
|
||||
e->blocks = 2;
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
/* todo, per edid */
|
||||
state->aspect_ratio = v4l2_calc_aspect_ratio(e->edid[0x15],
|
||||
|
@@ -102,7 +102,7 @@ static int ak881x_try_g_mbus_fmt(struct v4l2_subdev *sd,
|
||||
v4l_bound_align_image(&mf->width, 0, 720, 2,
|
||||
&mf->height, 0, ak881x->lines, 1, 0);
|
||||
mf->field = V4L2_FIELD_INTERLACED;
|
||||
mf->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
return 0;
|
||||
@@ -112,19 +112,19 @@ static int ak881x_s_mbus_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_mbus_framefmt *mf)
|
||||
{
|
||||
if (mf->field != V4L2_FIELD_INTERLACED ||
|
||||
mf->code != V4L2_MBUS_FMT_YUYV8_2X8)
|
||||
mf->code != MEDIA_BUS_FMT_YUYV8_2X8)
|
||||
return -EINVAL;
|
||||
|
||||
return ak881x_try_g_mbus_fmt(sd, mf);
|
||||
}
|
||||
|
||||
static int ak881x_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -879,7 +879,7 @@ void cx25840_std_setup(struct i2c_client *client)
|
||||
/* Sets horizontal blanking delay and active lines */
|
||||
cx25840_write(client, 0x470, hblank);
|
||||
cx25840_write(client, 0x471,
|
||||
0xff & (((hblank >> 8) & 0x3) | (hactive << 4)));
|
||||
(((hblank >> 8) & 0x3) | (hactive << 4)) & 0xff);
|
||||
cx25840_write(client, 0x472, hactive >> 4);
|
||||
|
||||
/* Sets burst gate delay */
|
||||
@@ -888,13 +888,13 @@ void cx25840_std_setup(struct i2c_client *client)
|
||||
/* Sets vertical blanking delay and active duration */
|
||||
cx25840_write(client, 0x474, vblank);
|
||||
cx25840_write(client, 0x475,
|
||||
0xff & (((vblank >> 8) & 0x3) | (vactive << 4)));
|
||||
(((vblank >> 8) & 0x3) | (vactive << 4)) & 0xff);
|
||||
cx25840_write(client, 0x476, vactive >> 4);
|
||||
cx25840_write(client, 0x477, vblank656);
|
||||
|
||||
/* Sets src decimation rate */
|
||||
cx25840_write(client, 0x478, 0xff & src_decimation);
|
||||
cx25840_write(client, 0x479, 0xff & (src_decimation >> 8));
|
||||
cx25840_write(client, 0x478, src_decimation & 0xff);
|
||||
cx25840_write(client, 0x479, (src_decimation >> 8) & 0xff);
|
||||
|
||||
/* Sets Luma and UV Low pass filters */
|
||||
cx25840_write(client, 0x47a, luma_lpf << 6 | ((uv_lpf << 4) & 0x30));
|
||||
@@ -904,8 +904,8 @@ void cx25840_std_setup(struct i2c_client *client)
|
||||
|
||||
/* Sets SC Step*/
|
||||
cx25840_write(client, 0x47c, sc);
|
||||
cx25840_write(client, 0x47d, 0xff & sc >> 8);
|
||||
cx25840_write(client, 0x47e, 0xff & sc >> 16);
|
||||
cx25840_write(client, 0x47d, (sc >> 8) & 0xff);
|
||||
cx25840_write(client, 0x47e, (sc >> 16) & 0xff);
|
||||
|
||||
/* Sets VBI parameters */
|
||||
if (std & V4L2_STD_625_50) {
|
||||
@@ -1373,7 +1373,7 @@ static int cx25840_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt
|
||||
int HSC, VSC, Vsrc, Hsrc, filter, Vlines;
|
||||
int is_50Hz = !(state->std & V4L2_STD_525_60);
|
||||
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
|
@@ -113,7 +113,7 @@ int cx25840_loadfw(struct i2c_client *client)
|
||||
const u8 *ptr;
|
||||
const char *fwname = get_fw_name(client);
|
||||
int size, retval;
|
||||
int MAX_BUF_SIZE = FWSEND;
|
||||
int max_buf_size = FWSEND;
|
||||
u32 gpio_oe = 0, gpio_da = 0;
|
||||
|
||||
if (is_cx2388x(state)) {
|
||||
@@ -122,10 +122,9 @@ int cx25840_loadfw(struct i2c_client *client)
|
||||
gpio_da = cx25840_read(client, 0x164);
|
||||
}
|
||||
|
||||
if (is_cx231xx(state) && MAX_BUF_SIZE > 16) {
|
||||
v4l_err(client, " Firmware download size changed to 16 bytes max length\n");
|
||||
MAX_BUF_SIZE = 16; /* cx231xx cannot accept more than 16 bytes at a time */
|
||||
}
|
||||
/* cx231xx cannot accept more than 16 bytes at a time */
|
||||
if (is_cx231xx(state) && max_buf_size > 16)
|
||||
max_buf_size = 16;
|
||||
|
||||
if (request_firmware(&fw, fwname, FWDEV(client)) != 0) {
|
||||
v4l_err(client, "unable to open firmware %s\n", fwname);
|
||||
@@ -140,7 +139,7 @@ int cx25840_loadfw(struct i2c_client *client)
|
||||
size = fw->size;
|
||||
ptr = fw->data;
|
||||
while (size > 0) {
|
||||
int len = min(MAX_BUF_SIZE - 2, size);
|
||||
int len = min(max_buf_size - 2, size);
|
||||
|
||||
memcpy(buffer + 2, ptr, len);
|
||||
|
||||
|
@@ -464,8 +464,7 @@ static int ir_remove(struct i2c_client *client)
|
||||
cancel_delayed_work_sync(&ir->work);
|
||||
|
||||
/* unregister device */
|
||||
if (ir->rc)
|
||||
rc_unregister_device(ir->rc);
|
||||
rc_unregister_device(ir->rc);
|
||||
|
||||
/* free memory */
|
||||
return 0;
|
||||
|
@@ -57,14 +57,14 @@ static struct v4l2_mbus_framefmt m5mols_default_ffmt[M5MOLS_RESTYPE_MAX] = {
|
||||
[M5MOLS_RESTYPE_MONITOR] = {
|
||||
.width = 1920,
|
||||
.height = 1080,
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
[M5MOLS_RESTYPE_CAPTURE] = {
|
||||
.width = 1920,
|
||||
.height = 1080,
|
||||
.code = V4L2_MBUS_FMT_JPEG_1X8,
|
||||
.code = MEDIA_BUS_FMT_JPEG_1X8,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
@@ -479,7 +479,7 @@ static int m5mols_get_version(struct v4l2_subdev *sd)
|
||||
* __find_restype - Lookup M-5MOLS resolution type according to pixel code
|
||||
* @code: pixel code
|
||||
*/
|
||||
static enum m5mols_restype __find_restype(enum v4l2_mbus_pixelcode code)
|
||||
static enum m5mols_restype __find_restype(u32 code)
|
||||
{
|
||||
enum m5mols_restype type = M5MOLS_RESTYPE_MONITOR;
|
||||
|
||||
|
@@ -192,12 +192,12 @@ static int ml86v7667_g_input_status(struct v4l2_subdev *sd, u32 *status)
|
||||
}
|
||||
|
||||
static int ml86v7667_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
*code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -207,7 +207,7 @@ static int ml86v7667_mbus_fmt(struct v4l2_subdev *sd,
|
||||
{
|
||||
struct ml86v7667_priv *priv = to_ml86v7667(sd);
|
||||
|
||||
fmt->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
fmt->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
/* The top field is always transferred first by the chip */
|
||||
fmt->field = V4L2_FIELD_INTERLACED_TB;
|
||||
|
@@ -323,7 +323,7 @@ static int mt9m032_enum_mbus_code(struct v4l2_subdev *subdev,
|
||||
if (code->index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
code->code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -331,7 +331,7 @@ static int mt9m032_enum_frame_size(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index != 0 || fse->code != V4L2_MBUS_FMT_Y8_1X8)
|
||||
if (fse->index != 0 || fse->code != MEDIA_BUS_FMT_Y8_1X8)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = MT9M032_COLUMN_SIZE_DEF;
|
||||
@@ -759,7 +759,7 @@ static int mt9m032_probe(struct i2c_client *client,
|
||||
|
||||
sensor->format.width = sensor->crop.width;
|
||||
sensor->format.height = sensor->crop.height;
|
||||
sensor->format.code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
sensor->format.code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
sensor->format.field = V4L2_FIELD_NONE;
|
||||
sensor->format.colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
|
@@ -950,9 +950,9 @@ static int mt9p031_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
||||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
|
||||
if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
|
||||
format->code = V4L2_MBUS_FMT_Y12_1X12;
|
||||
format->code = MEDIA_BUS_FMT_Y12_1X12;
|
||||
else
|
||||
format->code = V4L2_MBUS_FMT_SGRBG12_1X12;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
|
||||
|
||||
format->width = MT9P031_WINDOW_WIDTH_DEF;
|
||||
format->height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
@@ -1120,9 +1120,9 @@ static int mt9p031_probe(struct i2c_client *client,
|
||||
mt9p031->crop.top = MT9P031_ROW_START_DEF;
|
||||
|
||||
if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
|
||||
mt9p031->format.code = V4L2_MBUS_FMT_Y12_1X12;
|
||||
mt9p031->format.code = MEDIA_BUS_FMT_Y12_1X12;
|
||||
else
|
||||
mt9p031->format.code = V4L2_MBUS_FMT_SGRBG12_1X12;
|
||||
mt9p031->format.code = MEDIA_BUS_FMT_SGRBG12_1X12;
|
||||
|
||||
mt9p031->format.width = MT9P031_WINDOW_WIDTH_DEF;
|
||||
mt9p031->format.height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
|
@@ -333,7 +333,7 @@ static int mt9t001_enum_mbus_code(struct v4l2_subdev *subdev,
|
||||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -341,7 +341,7 @@ static int mt9t001_enum_frame_size(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index >= 8 || fse->code != V4L2_MBUS_FMT_SGRBG10_1X10)
|
||||
if (fse->index >= 8 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = (MT9T001_WINDOW_WIDTH_DEF + 1) / fse->index;
|
||||
@@ -792,7 +792,7 @@ static int mt9t001_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
||||
crop->height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
|
||||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
format->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
format->width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
format->height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
@@ -917,7 +917,7 @@ static int mt9t001_probe(struct i2c_client *client,
|
||||
mt9t001->crop.width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
mt9t001->crop.height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
|
||||
mt9t001->format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
mt9t001->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
mt9t001->format.width = MT9T001_WINDOW_WIDTH_DEF + 1;
|
||||
mt9t001->format.height = MT9T001_WINDOW_HEIGHT_DEF + 1;
|
||||
mt9t001->format.field = V4L2_FIELD_NONE;
|
||||
|
@@ -325,18 +325,18 @@ static int mt9v011_reset(struct v4l2_subdev *sd, u32 val)
|
||||
}
|
||||
|
||||
static int mt9v011_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_SGRBG8_1X8;
|
||||
*code = MEDIA_BUS_FMT_SGRBG8_1X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt9v011_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
|
||||
{
|
||||
if (fmt->code != V4L2_MBUS_FMT_SGRBG8_1X8)
|
||||
if (fmt->code != MEDIA_BUS_FMT_SGRBG8_1X8)
|
||||
return -EINVAL;
|
||||
|
||||
v4l_bound_align_image(&fmt->width, 48, 639, 1,
|
||||
|
@@ -454,7 +454,7 @@ static int mt9v032_enum_mbus_code(struct v4l2_subdev *subdev,
|
||||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
code->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -462,7 +462,7 @@ static int mt9v032_enum_frame_size(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_frame_size_enum *fse)
|
||||
{
|
||||
if (fse->index >= 3 || fse->code != V4L2_MBUS_FMT_SGRBG10_1X10)
|
||||
if (fse->index >= 3 || fse->code != MEDIA_BUS_FMT_SGRBG10_1X10)
|
||||
return -EINVAL;
|
||||
|
||||
fse->min_width = MT9V032_WINDOW_WIDTH_DEF / (1 << fse->index);
|
||||
@@ -814,9 +814,9 @@ static int mt9v032_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
|
||||
format = v4l2_subdev_get_try_format(fh, 0);
|
||||
|
||||
if (mt9v032->model->color)
|
||||
format->code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
else
|
||||
format->code = V4L2_MBUS_FMT_Y10_1X10;
|
||||
format->code = MEDIA_BUS_FMT_Y10_1X10;
|
||||
|
||||
format->width = MT9V032_WINDOW_WIDTH_DEF;
|
||||
format->height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
@@ -966,9 +966,9 @@ static int mt9v032_probe(struct i2c_client *client,
|
||||
mt9v032->crop.height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
||||
if (mt9v032->model->color)
|
||||
mt9v032->format.code = V4L2_MBUS_FMT_SGRBG10_1X10;
|
||||
mt9v032->format.code = MEDIA_BUS_FMT_SGRBG10_1X10;
|
||||
else
|
||||
mt9v032->format.code = V4L2_MBUS_FMT_Y10_1X10;
|
||||
mt9v032->format.code = MEDIA_BUS_FMT_Y10_1X10;
|
||||
|
||||
mt9v032->format.width = MT9V032_WINDOW_WIDTH_DEF;
|
||||
mt9v032->format.height = MT9V032_WINDOW_HEIGHT_DEF;
|
||||
|
@@ -112,7 +112,7 @@ MODULE_PARM_DESC(debug, "Enable module debug trace. Set to 1 to enable.");
|
||||
#define REG_TERM 0xFFFF
|
||||
|
||||
struct noon010_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u16 ispctl1_reg;
|
||||
};
|
||||
@@ -175,23 +175,23 @@ static const struct noon010_frmsize noon010_sizes[] = {
|
||||
/* Supported pixel formats. */
|
||||
static const struct noon010_format noon010_formats[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x03,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x02,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x01,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x40,
|
||||
},
|
||||
|
@@ -632,31 +632,31 @@ static int ov7670_detect(struct v4l2_subdev *sd)
|
||||
* The magic matrix numbers come from OmniVision.
|
||||
*/
|
||||
static struct ov7670_format_struct {
|
||||
enum v4l2_mbus_pixelcode mbus_code;
|
||||
u32 mbus_code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
struct regval_list *regs;
|
||||
int cmatrix[CMATRIX_LEN];
|
||||
} ov7670_formats[] = {
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.regs = ov7670_fmt_yuv422,
|
||||
.cmatrix = { 128, -128, 0, -34, -94, 128 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE,
|
||||
.mbus_code = MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_rgb444,
|
||||
.cmatrix = { 179, -179, 0, -61, -176, 228 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_rgb565,
|
||||
.cmatrix = { 179, -179, 0, -61, -176, 228 },
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_SBGGR8_1X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.regs = ov7670_fmt_raw,
|
||||
.cmatrix = { 0, 0, 0, 0, 0, 0 },
|
||||
@@ -772,7 +772,7 @@ static void ov7675_get_framerate(struct v4l2_subdev *sd,
|
||||
pll_factor = PLL_FACTOR;
|
||||
|
||||
clkrc++;
|
||||
if (info->fmt->mbus_code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (info->fmt->mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
clkrc = (clkrc >> 1);
|
||||
|
||||
tpf->numerator = 1;
|
||||
@@ -810,7 +810,7 @@ static int ov7675_set_framerate(struct v4l2_subdev *sd,
|
||||
} else {
|
||||
clkrc = (5 * pll_factor * info->clock_speed * tpf->numerator) /
|
||||
(4 * tpf->denominator);
|
||||
if (info->fmt->mbus_code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (info->fmt->mbus_code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
clkrc = (clkrc << 1);
|
||||
clkrc--;
|
||||
}
|
||||
@@ -900,7 +900,7 @@ static int ov7670_set_hw(struct v4l2_subdev *sd, int hstart, int hstop,
|
||||
|
||||
|
||||
static int ov7670_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= N_OV7670_FMTS)
|
||||
return -EINVAL;
|
||||
|
@@ -384,17 +384,17 @@ static const struct ov965x_framesize ov965x_framesizes[] = {
|
||||
};
|
||||
|
||||
struct ov965x_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_TSLB value, only bits [3:2] may be set. */
|
||||
u8 tslb_reg;
|
||||
};
|
||||
|
||||
static const struct ov965x_pixfmt ov965x_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 0x00},
|
||||
{ V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG, 0x04},
|
||||
{ V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG, 0x0c},
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 0x08},
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 0x00},
|
||||
{ MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG, 0x04},
|
||||
{ MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG, 0x0c},
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 0x08},
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -27,8 +27,8 @@
|
||||
|
||||
#define DRIVER_NAME "S5C73M3"
|
||||
|
||||
#define S5C73M3_ISP_FMT V4L2_MBUS_FMT_VYUY8_2X8
|
||||
#define S5C73M3_JPEG_FMT V4L2_MBUS_FMT_S5C_UYVY_JPEG_1X8
|
||||
#define S5C73M3_ISP_FMT MEDIA_BUS_FMT_VYUY8_2X8
|
||||
#define S5C73M3_JPEG_FMT MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8
|
||||
|
||||
/* Subdevs pad index definitions */
|
||||
enum s5c73m3_pads {
|
||||
@@ -402,7 +402,7 @@ struct s5c73m3 {
|
||||
|
||||
const struct s5c73m3_frame_size *sensor_pix_size[2];
|
||||
const struct s5c73m3_frame_size *oif_pix_size[2];
|
||||
enum v4l2_mbus_pixelcode mbus_code;
|
||||
u32 mbus_code;
|
||||
|
||||
const struct s5c73m3_interval *fiv;
|
||||
|
||||
|
@@ -151,7 +151,7 @@ static const struct s5k4ecgx_frmsize s5k4ecgx_prev_sizes[] = {
|
||||
#define S5K4ECGX_NUM_PREV ARRAY_SIZE(s5k4ecgx_prev_sizes)
|
||||
|
||||
struct s5k4ecgx_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_TC_PCFG_Format register value */
|
||||
u16 reg_p_format;
|
||||
@@ -159,7 +159,7 @@ struct s5k4ecgx_pixfmt {
|
||||
|
||||
/* By default value, output from sensor will be YUV422 0-255 */
|
||||
static const struct s5k4ecgx_pixfmt s5k4ecgx_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
};
|
||||
|
||||
static const char * const s5k4ecgx_supply_names[] = {
|
||||
|
@@ -248,7 +248,7 @@ enum s5k5baf_gpio_id {
|
||||
#define NUM_ISP_PADS 2
|
||||
|
||||
struct s5k5baf_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_P_FMT(x) register value */
|
||||
u16 reg_p_fmt;
|
||||
@@ -331,10 +331,10 @@ struct s5k5baf {
|
||||
};
|
||||
|
||||
static const struct s5k5baf_pixfmt s5k5baf_formats[] = {
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
/* range 16-240 */
|
||||
{ V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
{ MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
};
|
||||
|
||||
static struct v4l2_rect s5k5baf_cis_rect = {
|
||||
@@ -1206,7 +1206,7 @@ static int s5k5baf_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
if (code->pad == PAD_CIS) {
|
||||
if (code->index > 0)
|
||||
return -EINVAL;
|
||||
code->code = V4L2_MBUS_FMT_FIXED;
|
||||
code->code = MEDIA_BUS_FMT_FIXED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1227,7 +1227,7 @@ static int s5k5baf_enum_frame_size(struct v4l2_subdev *sd,
|
||||
return -EINVAL;
|
||||
|
||||
if (fse->pad == PAD_CIS) {
|
||||
fse->code = V4L2_MBUS_FMT_FIXED;
|
||||
fse->code = MEDIA_BUS_FMT_FIXED;
|
||||
fse->min_width = S5K5BAF_CIS_WIDTH;
|
||||
fse->max_width = S5K5BAF_CIS_WIDTH;
|
||||
fse->min_height = S5K5BAF_CIS_HEIGHT;
|
||||
@@ -1252,7 +1252,7 @@ static void s5k5baf_try_cis_format(struct v4l2_mbus_framefmt *mf)
|
||||
{
|
||||
mf->width = S5K5BAF_CIS_WIDTH;
|
||||
mf->height = S5K5BAF_CIS_HEIGHT;
|
||||
mf->code = V4L2_MBUS_FMT_FIXED;
|
||||
mf->code = MEDIA_BUS_FMT_FIXED;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
}
|
||||
|
@@ -80,7 +80,7 @@ static inline struct s5k6a3 *sd_to_s5k6a3(struct v4l2_subdev *sd)
|
||||
|
||||
static const struct v4l2_mbus_framefmt s5k6a3_formats[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_SGRBG10_1X10,
|
||||
.code = MEDIA_BUS_FMT_SGRBG10_1X10,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
}
|
||||
|
@@ -191,7 +191,7 @@ struct s5k6aa_regval {
|
||||
};
|
||||
|
||||
struct s5k6aa_pixfmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
u32 colorspace;
|
||||
/* REG_P_FMT(x) register value */
|
||||
u16 reg_p_fmt;
|
||||
@@ -285,10 +285,10 @@ static struct s5k6aa_regval s5k6aa_analog_config[] = {
|
||||
|
||||
/* TODO: Add RGB888 and Bayer format */
|
||||
static const struct s5k6aa_pixfmt s5k6aa_formats[] = {
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG, 5 },
|
||||
/* range 16-240 */
|
||||
{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
{ MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_REC709, 6 },
|
||||
{ MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_JPEG, 0 },
|
||||
};
|
||||
|
||||
static const struct s5k6aa_interval s5k6aa_intervals[] = {
|
||||
|
@@ -562,7 +562,7 @@ static int saa6752hs_g_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
|
||||
h->video_format = SAA6752HS_VF_D1;
|
||||
f->width = v4l2_format_table[h->video_format].fmt.pix.width;
|
||||
f->height = v4l2_format_table[h->video_format].fmt.pix.height;
|
||||
f->code = V4L2_MBUS_FMT_FIXED;
|
||||
f->code = MEDIA_BUS_FMT_FIXED;
|
||||
f->field = V4L2_FIELD_INTERLACED;
|
||||
f->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
return 0;
|
||||
@@ -572,7 +572,7 @@ static int saa6752hs_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_frame
|
||||
{
|
||||
int dist_352, dist_480, dist_720;
|
||||
|
||||
f->code = V4L2_MBUS_FMT_FIXED;
|
||||
f->code = MEDIA_BUS_FMT_FIXED;
|
||||
|
||||
dist_352 = abs(f->width - 352);
|
||||
dist_480 = abs(f->width - 480);
|
||||
@@ -599,7 +599,7 @@ static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefm
|
||||
{
|
||||
struct saa6752hs_state *h = to_state(sd);
|
||||
|
||||
if (f->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (f->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
|
@@ -1172,7 +1172,7 @@ static int saa711x_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_f
|
||||
|
||||
static int saa711x_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
|
||||
{
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
@@ -998,7 +998,7 @@ static int saa717x_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt
|
||||
|
||||
v4l2_dbg(1, debug, sd, "decoder set size\n");
|
||||
|
||||
if (fmt->code != V4L2_MBUS_FMT_FIXED)
|
||||
if (fmt->code != MEDIA_BUS_FMT_FIXED)
|
||||
return -EINVAL;
|
||||
|
||||
/* FIXME need better bounds checking here */
|
||||
|
@@ -65,264 +65,36 @@ static int bounds_check(struct device *dev, uint32_t val,
|
||||
|
||||
static void print_pll(struct device *dev, struct smiapp_pll *pll)
|
||||
{
|
||||
dev_dbg(dev, "pre_pll_clk_div\t%d\n", pll->pre_pll_clk_div);
|
||||
dev_dbg(dev, "pll_multiplier \t%d\n", pll->pll_multiplier);
|
||||
if (pll->flags != SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
dev_dbg(dev, "op_sys_clk_div \t%d\n", pll->op_sys_clk_div);
|
||||
dev_dbg(dev, "op_pix_clk_div \t%d\n", pll->op_pix_clk_div);
|
||||
dev_dbg(dev, "pre_pll_clk_div\t%u\n", pll->pre_pll_clk_div);
|
||||
dev_dbg(dev, "pll_multiplier \t%u\n", pll->pll_multiplier);
|
||||
if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) {
|
||||
dev_dbg(dev, "op_sys_clk_div \t%u\n", pll->op.sys_clk_div);
|
||||
dev_dbg(dev, "op_pix_clk_div \t%u\n", pll->op.pix_clk_div);
|
||||
}
|
||||
dev_dbg(dev, "vt_sys_clk_div \t%d\n", pll->vt_sys_clk_div);
|
||||
dev_dbg(dev, "vt_pix_clk_div \t%d\n", pll->vt_pix_clk_div);
|
||||
dev_dbg(dev, "vt_sys_clk_div \t%u\n", pll->vt.sys_clk_div);
|
||||
dev_dbg(dev, "vt_pix_clk_div \t%u\n", pll->vt.pix_clk_div);
|
||||
|
||||
dev_dbg(dev, "ext_clk_freq_hz \t%d\n", pll->ext_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_ip_clk_freq_hz \t%d\n", pll->pll_ip_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_op_clk_freq_hz \t%d\n", pll->pll_op_clk_freq_hz);
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
dev_dbg(dev, "op_sys_clk_freq_hz \t%d\n",
|
||||
pll->op_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "op_pix_clk_freq_hz \t%d\n",
|
||||
pll->op_pix_clk_freq_hz);
|
||||
dev_dbg(dev, "ext_clk_freq_hz \t%u\n", pll->ext_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_ip_clk_freq_hz \t%u\n", pll->pll_ip_clk_freq_hz);
|
||||
dev_dbg(dev, "pll_op_clk_freq_hz \t%u\n", pll->pll_op_clk_freq_hz);
|
||||
if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) {
|
||||
dev_dbg(dev, "op_sys_clk_freq_hz \t%u\n",
|
||||
pll->op.sys_clk_freq_hz);
|
||||
dev_dbg(dev, "op_pix_clk_freq_hz \t%u\n",
|
||||
pll->op.pix_clk_freq_hz);
|
||||
}
|
||||
dev_dbg(dev, "vt_sys_clk_freq_hz \t%d\n", pll->vt_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_pix_clk_freq_hz \t%d\n", pll->vt_pix_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_sys_clk_freq_hz \t%u\n", pll->vt.sys_clk_freq_hz);
|
||||
dev_dbg(dev, "vt_pix_clk_freq_hz \t%u\n", pll->vt.pix_clk_freq_hz);
|
||||
}
|
||||
|
||||
/*
|
||||
* Heuristically guess the PLL tree for a given common multiplier and
|
||||
* divisor. Begin with the operational timing and continue to video
|
||||
* timing once operational timing has been verified.
|
||||
*
|
||||
* @mul is the PLL multiplier and @div is the common divisor
|
||||
* (pre_pll_clk_div and op_sys_clk_div combined). The final PLL
|
||||
* multiplier will be a multiple of @mul.
|
||||
*
|
||||
* @return Zero on success, error code on error.
|
||||
*/
|
||||
static int __smiapp_pll_calculate(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
struct smiapp_pll *pll, uint32_t mul,
|
||||
uint32_t div, uint32_t lane_op_clock_ratio)
|
||||
static int check_all_bounds(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
const struct smiapp_pll_branch_limits *op_limits,
|
||||
struct smiapp_pll *pll,
|
||||
struct smiapp_pll_branch *op_pll)
|
||||
{
|
||||
uint32_t sys_div;
|
||||
uint32_t best_pix_div = INT_MAX >> 1;
|
||||
uint32_t vt_op_binning_div;
|
||||
/*
|
||||
* Higher multipliers (and divisors) are often required than
|
||||
* necessitated by the external clock and the output clocks.
|
||||
* There are limits for all values in the clock tree. These
|
||||
* are the minimum and maximum multiplier for mul.
|
||||
*/
|
||||
uint32_t more_mul_min, more_mul_max;
|
||||
uint32_t more_mul_factor;
|
||||
uint32_t min_vt_div, max_vt_div, vt_div;
|
||||
uint32_t min_sys_div, max_sys_div;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
/*
|
||||
* Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be
|
||||
* too high.
|
||||
*/
|
||||
dev_dbg(dev, "pre_pll_clk_div %d\n", pll->pre_pll_clk_div);
|
||||
|
||||
/* Don't go above max pll multiplier. */
|
||||
more_mul_max = limits->max_pll_multiplier / mul;
|
||||
dev_dbg(dev, "more_mul_max: max_pll_multiplier check: %d\n",
|
||||
more_mul_max);
|
||||
/* Don't go above max pll op frequency. */
|
||||
more_mul_max =
|
||||
min_t(uint32_t,
|
||||
more_mul_max,
|
||||
limits->max_pll_op_freq_hz
|
||||
/ (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul));
|
||||
dev_dbg(dev, "more_mul_max: max_pll_op_freq_hz check: %d\n",
|
||||
more_mul_max);
|
||||
/* Don't go above the division capability of op sys clock divider. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
limits->op.max_sys_clk_div * pll->pre_pll_clk_div
|
||||
/ div);
|
||||
dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %d\n",
|
||||
more_mul_max);
|
||||
/* Ensure we won't go above min_pll_multiplier. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
DIV_ROUND_UP(limits->max_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_max: min_pll_multiplier check: %d\n",
|
||||
more_mul_max);
|
||||
|
||||
/* Ensure we won't go below min_pll_op_freq_hz. */
|
||||
more_mul_min = DIV_ROUND_UP(limits->min_pll_op_freq_hz,
|
||||
pll->ext_clk_freq_hz / pll->pre_pll_clk_div
|
||||
* mul);
|
||||
dev_dbg(dev, "more_mul_min: min_pll_op_freq_hz check: %d\n",
|
||||
more_mul_min);
|
||||
/* Ensure we won't go below min_pll_multiplier. */
|
||||
more_mul_min = max(more_mul_min,
|
||||
DIV_ROUND_UP(limits->min_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_min: min_pll_multiplier check: %d\n",
|
||||
more_mul_min);
|
||||
|
||||
if (more_mul_min > more_mul_max) {
|
||||
dev_dbg(dev,
|
||||
"unable to compute more_mul_min and more_mul_max\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div;
|
||||
dev_dbg(dev, "more_mul_factor: %d\n", more_mul_factor);
|
||||
more_mul_factor = lcm(more_mul_factor, limits->op.min_sys_clk_div);
|
||||
dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n",
|
||||
more_mul_factor);
|
||||
i = roundup(more_mul_min, more_mul_factor);
|
||||
if (!is_one_or_even(i))
|
||||
i <<= 1;
|
||||
|
||||
dev_dbg(dev, "final more_mul: %d\n", i);
|
||||
if (i > more_mul_max) {
|
||||
dev_dbg(dev, "final more_mul is bad, max %d\n", more_mul_max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pll->pll_multiplier = mul * i;
|
||||
pll->op_sys_clk_div = div * i / pll->pre_pll_clk_div;
|
||||
dev_dbg(dev, "op_sys_clk_div: %d\n", pll->op_sys_clk_div);
|
||||
|
||||
pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz
|
||||
/ pll->pre_pll_clk_div;
|
||||
|
||||
pll->pll_op_clk_freq_hz = pll->pll_ip_clk_freq_hz
|
||||
* pll->pll_multiplier;
|
||||
|
||||
/* Derive pll_op_clk_freq_hz. */
|
||||
pll->op_sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->op_sys_clk_div;
|
||||
|
||||
pll->op_pix_clk_div = pll->bits_per_pixel;
|
||||
dev_dbg(dev, "op_pix_clk_div: %d\n", pll->op_pix_clk_div);
|
||||
|
||||
pll->op_pix_clk_freq_hz =
|
||||
pll->op_sys_clk_freq_hz / pll->op_pix_clk_div;
|
||||
|
||||
/*
|
||||
* Some sensors perform analogue binning and some do this
|
||||
* digitally. The ones doing this digitally can be roughly be
|
||||
* found out using this formula. The ones doing this digitally
|
||||
* should run at higher clock rate, so smaller divisor is used
|
||||
* on video timing side.
|
||||
*/
|
||||
if (limits->min_line_length_pck_bin > limits->min_line_length_pck
|
||||
/ pll->binning_horizontal)
|
||||
vt_op_binning_div = pll->binning_horizontal;
|
||||
else
|
||||
vt_op_binning_div = 1;
|
||||
dev_dbg(dev, "vt_op_binning_div: %d\n", vt_op_binning_div);
|
||||
|
||||
/*
|
||||
* Profile 2 supports vt_pix_clk_div E [4, 10]
|
||||
*
|
||||
* Horizontal binning can be used as a base for difference in
|
||||
* divisors. One must make sure that horizontal blanking is
|
||||
* enough to accommodate the CSI-2 sync codes.
|
||||
*
|
||||
* Take scaling factor into account as well.
|
||||
*
|
||||
* Find absolute limits for the factor of vt divider.
|
||||
*/
|
||||
dev_dbg(dev, "scale_m: %d\n", pll->scale_m);
|
||||
min_vt_div = DIV_ROUND_UP(pll->op_pix_clk_div * pll->op_sys_clk_div
|
||||
* pll->scale_n,
|
||||
lane_op_clock_ratio * vt_op_binning_div
|
||||
* pll->scale_m);
|
||||
|
||||
/* Find smallest and biggest allowed vt divisor. */
|
||||
dev_dbg(dev, "min_vt_div: %d\n", min_vt_div);
|
||||
min_vt_div = max(min_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %d\n",
|
||||
min_vt_div);
|
||||
min_vt_div = max_t(uint32_t, min_vt_div,
|
||||
limits->vt.min_pix_clk_div
|
||||
* limits->vt.min_sys_clk_div);
|
||||
dev_dbg(dev, "min_vt_div: min_vt_clk_div: %d\n", min_vt_div);
|
||||
|
||||
max_vt_div = limits->vt.max_sys_clk_div * limits->vt.max_pix_clk_div;
|
||||
dev_dbg(dev, "max_vt_div: %d\n", max_vt_div);
|
||||
max_vt_div = min(max_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %d\n",
|
||||
max_vt_div);
|
||||
|
||||
/*
|
||||
* Find limitsits for sys_clk_div. Not all values are possible
|
||||
* with all values of pix_clk_div.
|
||||
*/
|
||||
min_sys_div = limits->vt.min_sys_clk_div;
|
||||
dev_dbg(dev, "min_sys_div: %d\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
DIV_ROUND_UP(min_vt_div,
|
||||
limits->vt.max_pix_clk_div));
|
||||
dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %d\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
pll->pll_op_clk_freq_hz
|
||||
/ limits->vt.max_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %d\n", min_sys_div);
|
||||
min_sys_div = clk_div_even_up(min_sys_div);
|
||||
dev_dbg(dev, "min_sys_div: one or even: %d\n", min_sys_div);
|
||||
|
||||
max_sys_div = limits->vt.max_sys_clk_div;
|
||||
dev_dbg(dev, "max_sys_div: %d\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(max_vt_div,
|
||||
limits->vt.min_pix_clk_div));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %d\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %d\n", max_sys_div);
|
||||
|
||||
/*
|
||||
* Find pix_div such that a legal pix_div * sys_div results
|
||||
* into a value which is not smaller than div, the desired
|
||||
* divisor.
|
||||
*/
|
||||
for (vt_div = min_vt_div; vt_div <= max_vt_div;
|
||||
vt_div += 2 - (vt_div & 1)) {
|
||||
for (sys_div = min_sys_div;
|
||||
sys_div <= max_sys_div;
|
||||
sys_div += 2 - (sys_div & 1)) {
|
||||
uint16_t pix_div = DIV_ROUND_UP(vt_div, sys_div);
|
||||
|
||||
if (pix_div < limits->vt.min_pix_clk_div
|
||||
|| pix_div > limits->vt.max_pix_clk_div) {
|
||||
dev_dbg(dev,
|
||||
"pix_div %d too small or too big (%d--%d)\n",
|
||||
pix_div,
|
||||
limits->vt.min_pix_clk_div,
|
||||
limits->vt.max_pix_clk_div);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this one is better. */
|
||||
if (pix_div * sys_div
|
||||
<= roundup(min_vt_div, best_pix_div))
|
||||
best_pix_div = pix_div;
|
||||
}
|
||||
if (best_pix_div < INT_MAX >> 1)
|
||||
break;
|
||||
}
|
||||
|
||||
pll->vt_sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div);
|
||||
pll->vt_pix_clk_div = best_pix_div;
|
||||
|
||||
pll->vt_sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->vt_sys_clk_div;
|
||||
pll->vt_pix_clk_freq_hz =
|
||||
pll->vt_sys_clk_freq_hz / pll->vt_pix_clk_div;
|
||||
|
||||
pll->pixel_rate_csi =
|
||||
pll->op_pix_clk_freq_hz * lane_op_clock_ratio;
|
||||
|
||||
rval = bounds_check(dev, pll->pll_ip_clk_freq_hz,
|
||||
limits->min_pll_ip_freq_hz,
|
||||
limits->max_pll_ip_freq_hz,
|
||||
@@ -339,35 +111,38 @@ static int __smiapp_pll_calculate(struct device *dev,
|
||||
"pll_op_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_sys_clk_div,
|
||||
limits->op.min_sys_clk_div, limits->op.max_sys_clk_div,
|
||||
dev, op_pll->sys_clk_div,
|
||||
op_limits->min_sys_clk_div, op_limits->max_sys_clk_div,
|
||||
"op_sys_clk_div");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_pix_clk_div,
|
||||
limits->op.min_pix_clk_div, limits->op.max_pix_clk_div,
|
||||
"op_pix_clk_div");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_sys_clk_freq_hz,
|
||||
limits->op.min_sys_clk_freq_hz,
|
||||
limits->op.max_sys_clk_freq_hz,
|
||||
dev, op_pll->sys_clk_freq_hz,
|
||||
op_limits->min_sys_clk_freq_hz,
|
||||
op_limits->max_sys_clk_freq_hz,
|
||||
"op_sys_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->op_pix_clk_freq_hz,
|
||||
limits->op.min_pix_clk_freq_hz,
|
||||
limits->op.max_pix_clk_freq_hz,
|
||||
dev, op_pll->pix_clk_freq_hz,
|
||||
op_limits->min_pix_clk_freq_hz,
|
||||
op_limits->max_pix_clk_freq_hz,
|
||||
"op_pix_clk_freq_hz");
|
||||
|
||||
/*
|
||||
* If there are no OP clocks, the VT clocks are contained in
|
||||
* the OP clock struct.
|
||||
*/
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)
|
||||
return rval;
|
||||
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->vt_sys_clk_freq_hz,
|
||||
dev, pll->vt.sys_clk_freq_hz,
|
||||
limits->vt.min_sys_clk_freq_hz,
|
||||
limits->vt.max_sys_clk_freq_hz,
|
||||
"vt_sys_clk_freq_hz");
|
||||
if (!rval)
|
||||
rval = bounds_check(
|
||||
dev, pll->vt_pix_clk_freq_hz,
|
||||
dev, pll->vt.pix_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz,
|
||||
"vt_pix_clk_freq_hz");
|
||||
@@ -375,10 +150,258 @@ static int __smiapp_pll_calculate(struct device *dev,
|
||||
return rval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Heuristically guess the PLL tree for a given common multiplier and
|
||||
* divisor. Begin with the operational timing and continue to video
|
||||
* timing once operational timing has been verified.
|
||||
*
|
||||
* @mul is the PLL multiplier and @div is the common divisor
|
||||
* (pre_pll_clk_div and op_sys_clk_div combined). The final PLL
|
||||
* multiplier will be a multiple of @mul.
|
||||
*
|
||||
* @return Zero on success, error code on error.
|
||||
*/
|
||||
static int __smiapp_pll_calculate(
|
||||
struct device *dev, const struct smiapp_pll_limits *limits,
|
||||
const struct smiapp_pll_branch_limits *op_limits,
|
||||
struct smiapp_pll *pll, struct smiapp_pll_branch *op_pll, uint32_t mul,
|
||||
uint32_t div, uint32_t lane_op_clock_ratio)
|
||||
{
|
||||
uint32_t sys_div;
|
||||
uint32_t best_pix_div = INT_MAX >> 1;
|
||||
uint32_t vt_op_binning_div;
|
||||
/*
|
||||
* Higher multipliers (and divisors) are often required than
|
||||
* necessitated by the external clock and the output clocks.
|
||||
* There are limits for all values in the clock tree. These
|
||||
* are the minimum and maximum multiplier for mul.
|
||||
*/
|
||||
uint32_t more_mul_min, more_mul_max;
|
||||
uint32_t more_mul_factor;
|
||||
uint32_t min_vt_div, max_vt_div, vt_div;
|
||||
uint32_t min_sys_div, max_sys_div;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* Get pre_pll_clk_div so that our pll_op_clk_freq_hz won't be
|
||||
* too high.
|
||||
*/
|
||||
dev_dbg(dev, "pre_pll_clk_div %u\n", pll->pre_pll_clk_div);
|
||||
|
||||
/* Don't go above max pll multiplier. */
|
||||
more_mul_max = limits->max_pll_multiplier / mul;
|
||||
dev_dbg(dev, "more_mul_max: max_pll_multiplier check: %u\n",
|
||||
more_mul_max);
|
||||
/* Don't go above max pll op frequency. */
|
||||
more_mul_max =
|
||||
min_t(uint32_t,
|
||||
more_mul_max,
|
||||
limits->max_pll_op_freq_hz
|
||||
/ (pll->ext_clk_freq_hz / pll->pre_pll_clk_div * mul));
|
||||
dev_dbg(dev, "more_mul_max: max_pll_op_freq_hz check: %u\n",
|
||||
more_mul_max);
|
||||
/* Don't go above the division capability of op sys clock divider. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
op_limits->max_sys_clk_div * pll->pre_pll_clk_div
|
||||
/ div);
|
||||
dev_dbg(dev, "more_mul_max: max_op_sys_clk_div check: %u\n",
|
||||
more_mul_max);
|
||||
/* Ensure we won't go above min_pll_multiplier. */
|
||||
more_mul_max = min(more_mul_max,
|
||||
DIV_ROUND_UP(limits->max_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_max: min_pll_multiplier check: %u\n",
|
||||
more_mul_max);
|
||||
|
||||
/* Ensure we won't go below min_pll_op_freq_hz. */
|
||||
more_mul_min = DIV_ROUND_UP(limits->min_pll_op_freq_hz,
|
||||
pll->ext_clk_freq_hz / pll->pre_pll_clk_div
|
||||
* mul);
|
||||
dev_dbg(dev, "more_mul_min: min_pll_op_freq_hz check: %u\n",
|
||||
more_mul_min);
|
||||
/* Ensure we won't go below min_pll_multiplier. */
|
||||
more_mul_min = max(more_mul_min,
|
||||
DIV_ROUND_UP(limits->min_pll_multiplier, mul));
|
||||
dev_dbg(dev, "more_mul_min: min_pll_multiplier check: %u\n",
|
||||
more_mul_min);
|
||||
|
||||
if (more_mul_min > more_mul_max) {
|
||||
dev_dbg(dev,
|
||||
"unable to compute more_mul_min and more_mul_max\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
more_mul_factor = lcm(div, pll->pre_pll_clk_div) / div;
|
||||
dev_dbg(dev, "more_mul_factor: %u\n", more_mul_factor);
|
||||
more_mul_factor = lcm(more_mul_factor, op_limits->min_sys_clk_div);
|
||||
dev_dbg(dev, "more_mul_factor: min_op_sys_clk_div: %d\n",
|
||||
more_mul_factor);
|
||||
i = roundup(more_mul_min, more_mul_factor);
|
||||
if (!is_one_or_even(i))
|
||||
i <<= 1;
|
||||
|
||||
dev_dbg(dev, "final more_mul: %u\n", i);
|
||||
if (i > more_mul_max) {
|
||||
dev_dbg(dev, "final more_mul is bad, max %u\n", more_mul_max);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pll->pll_multiplier = mul * i;
|
||||
op_pll->sys_clk_div = div * i / pll->pre_pll_clk_div;
|
||||
dev_dbg(dev, "op_sys_clk_div: %u\n", op_pll->sys_clk_div);
|
||||
|
||||
pll->pll_ip_clk_freq_hz = pll->ext_clk_freq_hz
|
||||
/ pll->pre_pll_clk_div;
|
||||
|
||||
pll->pll_op_clk_freq_hz = pll->pll_ip_clk_freq_hz
|
||||
* pll->pll_multiplier;
|
||||
|
||||
/* Derive pll_op_clk_freq_hz. */
|
||||
op_pll->sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / op_pll->sys_clk_div;
|
||||
|
||||
op_pll->pix_clk_div = pll->bits_per_pixel;
|
||||
dev_dbg(dev, "op_pix_clk_div: %u\n", op_pll->pix_clk_div);
|
||||
|
||||
op_pll->pix_clk_freq_hz =
|
||||
op_pll->sys_clk_freq_hz / op_pll->pix_clk_div;
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
/* No OP clocks --- VT clocks are used instead. */
|
||||
goto out_skip_vt_calc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some sensors perform analogue binning and some do this
|
||||
* digitally. The ones doing this digitally can be roughly be
|
||||
* found out using this formula. The ones doing this digitally
|
||||
* should run at higher clock rate, so smaller divisor is used
|
||||
* on video timing side.
|
||||
*/
|
||||
if (limits->min_line_length_pck_bin > limits->min_line_length_pck
|
||||
/ pll->binning_horizontal)
|
||||
vt_op_binning_div = pll->binning_horizontal;
|
||||
else
|
||||
vt_op_binning_div = 1;
|
||||
dev_dbg(dev, "vt_op_binning_div: %u\n", vt_op_binning_div);
|
||||
|
||||
/*
|
||||
* Profile 2 supports vt_pix_clk_div E [4, 10]
|
||||
*
|
||||
* Horizontal binning can be used as a base for difference in
|
||||
* divisors. One must make sure that horizontal blanking is
|
||||
* enough to accommodate the CSI-2 sync codes.
|
||||
*
|
||||
* Take scaling factor into account as well.
|
||||
*
|
||||
* Find absolute limits for the factor of vt divider.
|
||||
*/
|
||||
dev_dbg(dev, "scale_m: %u\n", pll->scale_m);
|
||||
min_vt_div = DIV_ROUND_UP(op_pll->pix_clk_div * op_pll->sys_clk_div
|
||||
* pll->scale_n,
|
||||
lane_op_clock_ratio * vt_op_binning_div
|
||||
* pll->scale_m);
|
||||
|
||||
/* Find smallest and biggest allowed vt divisor. */
|
||||
dev_dbg(dev, "min_vt_div: %u\n", min_vt_div);
|
||||
min_vt_div = max(min_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.max_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "min_vt_div: max_vt_pix_clk_freq_hz: %u\n",
|
||||
min_vt_div);
|
||||
min_vt_div = max_t(uint32_t, min_vt_div,
|
||||
limits->vt.min_pix_clk_div
|
||||
* limits->vt.min_sys_clk_div);
|
||||
dev_dbg(dev, "min_vt_div: min_vt_clk_div: %u\n", min_vt_div);
|
||||
|
||||
max_vt_div = limits->vt.max_sys_clk_div * limits->vt.max_pix_clk_div;
|
||||
dev_dbg(dev, "max_vt_div: %u\n", max_vt_div);
|
||||
max_vt_div = min(max_vt_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_vt_div: min_vt_pix_clk_freq_hz: %u\n",
|
||||
max_vt_div);
|
||||
|
||||
/*
|
||||
* Find limitsits for sys_clk_div. Not all values are possible
|
||||
* with all values of pix_clk_div.
|
||||
*/
|
||||
min_sys_div = limits->vt.min_sys_clk_div;
|
||||
dev_dbg(dev, "min_sys_div: %u\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
DIV_ROUND_UP(min_vt_div,
|
||||
limits->vt.max_pix_clk_div));
|
||||
dev_dbg(dev, "min_sys_div: max_vt_pix_clk_div: %u\n", min_sys_div);
|
||||
min_sys_div = max(min_sys_div,
|
||||
pll->pll_op_clk_freq_hz
|
||||
/ limits->vt.max_sys_clk_freq_hz);
|
||||
dev_dbg(dev, "min_sys_div: max_pll_op_clk_freq_hz: %u\n", min_sys_div);
|
||||
min_sys_div = clk_div_even_up(min_sys_div);
|
||||
dev_dbg(dev, "min_sys_div: one or even: %u\n", min_sys_div);
|
||||
|
||||
max_sys_div = limits->vt.max_sys_clk_div;
|
||||
dev_dbg(dev, "max_sys_div: %u\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(max_vt_div,
|
||||
limits->vt.min_pix_clk_div));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_div: %u\n", max_sys_div);
|
||||
max_sys_div = min(max_sys_div,
|
||||
DIV_ROUND_UP(pll->pll_op_clk_freq_hz,
|
||||
limits->vt.min_pix_clk_freq_hz));
|
||||
dev_dbg(dev, "max_sys_div: min_vt_pix_clk_freq_hz: %u\n", max_sys_div);
|
||||
|
||||
/*
|
||||
* Find pix_div such that a legal pix_div * sys_div results
|
||||
* into a value which is not smaller than div, the desired
|
||||
* divisor.
|
||||
*/
|
||||
for (vt_div = min_vt_div; vt_div <= max_vt_div;
|
||||
vt_div += 2 - (vt_div & 1)) {
|
||||
for (sys_div = min_sys_div;
|
||||
sys_div <= max_sys_div;
|
||||
sys_div += 2 - (sys_div & 1)) {
|
||||
uint16_t pix_div = DIV_ROUND_UP(vt_div, sys_div);
|
||||
|
||||
if (pix_div < limits->vt.min_pix_clk_div
|
||||
|| pix_div > limits->vt.max_pix_clk_div) {
|
||||
dev_dbg(dev,
|
||||
"pix_div %u too small or too big (%u--%u)\n",
|
||||
pix_div,
|
||||
limits->vt.min_pix_clk_div,
|
||||
limits->vt.max_pix_clk_div);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if this one is better. */
|
||||
if (pix_div * sys_div
|
||||
<= roundup(min_vt_div, best_pix_div))
|
||||
best_pix_div = pix_div;
|
||||
}
|
||||
if (best_pix_div < INT_MAX >> 1)
|
||||
break;
|
||||
}
|
||||
|
||||
pll->vt.sys_clk_div = DIV_ROUND_UP(min_vt_div, best_pix_div);
|
||||
pll->vt.pix_clk_div = best_pix_div;
|
||||
|
||||
pll->vt.sys_clk_freq_hz =
|
||||
pll->pll_op_clk_freq_hz / pll->vt.sys_clk_div;
|
||||
pll->vt.pix_clk_freq_hz =
|
||||
pll->vt.sys_clk_freq_hz / pll->vt.pix_clk_div;
|
||||
|
||||
out_skip_vt_calc:
|
||||
pll->pixel_rate_csi =
|
||||
op_pll->pix_clk_freq_hz * lane_op_clock_ratio;
|
||||
pll->pixel_rate_pixel_array = pll->vt.pix_clk_freq_hz;
|
||||
|
||||
return check_all_bounds(dev, limits, op_limits, pll, op_pll);
|
||||
}
|
||||
|
||||
int smiapp_pll_calculate(struct device *dev,
|
||||
const struct smiapp_pll_limits *limits,
|
||||
struct smiapp_pll *pll)
|
||||
{
|
||||
const struct smiapp_pll_branch_limits *op_limits = &limits->op;
|
||||
struct smiapp_pll_branch *op_pll = &pll->op;
|
||||
uint16_t min_pre_pll_clk_div;
|
||||
uint16_t max_pre_pll_clk_div;
|
||||
uint32_t lane_op_clock_ratio;
|
||||
@@ -386,13 +409,23 @@ int smiapp_pll_calculate(struct device *dev,
|
||||
unsigned int i;
|
||||
int rval = -EINVAL;
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) {
|
||||
/*
|
||||
* If there's no OP PLL at all, use the VT values
|
||||
* instead. The OP values are ignored for the rest of
|
||||
* the PLL calculation.
|
||||
*/
|
||||
op_limits = &limits->vt;
|
||||
op_pll = &pll->vt;
|
||||
}
|
||||
|
||||
if (pll->flags & SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE)
|
||||
lane_op_clock_ratio = pll->csi2.lanes;
|
||||
else
|
||||
lane_op_clock_ratio = 1;
|
||||
dev_dbg(dev, "lane_op_clock_ratio: %d\n", lane_op_clock_ratio);
|
||||
dev_dbg(dev, "lane_op_clock_ratio: %u\n", lane_op_clock_ratio);
|
||||
|
||||
dev_dbg(dev, "binning: %dx%d\n", pll->binning_horizontal,
|
||||
dev_dbg(dev, "binning: %ux%u\n", pll->binning_horizontal,
|
||||
pll->binning_vertical);
|
||||
|
||||
switch (pll->bus_type) {
|
||||
@@ -411,7 +444,7 @@ int smiapp_pll_calculate(struct device *dev,
|
||||
}
|
||||
|
||||
/* Figure out limits for pre-pll divider based on extclk */
|
||||
dev_dbg(dev, "min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "min / max pre_pll_clk_div: %u / %u\n",
|
||||
limits->min_pre_pll_clk_div, limits->max_pre_pll_clk_div);
|
||||
max_pre_pll_clk_div =
|
||||
min_t(uint16_t, limits->max_pre_pll_clk_div,
|
||||
@@ -422,26 +455,27 @@ int smiapp_pll_calculate(struct device *dev,
|
||||
clk_div_even_up(
|
||||
DIV_ROUND_UP(pll->ext_clk_freq_hz,
|
||||
limits->max_pll_ip_freq_hz)));
|
||||
dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "pre-pll check: min / max pre_pll_clk_div: %u / %u\n",
|
||||
min_pre_pll_clk_div, max_pre_pll_clk_div);
|
||||
|
||||
i = gcd(pll->pll_op_clk_freq_hz, pll->ext_clk_freq_hz);
|
||||
mul = div_u64(pll->pll_op_clk_freq_hz, i);
|
||||
div = pll->ext_clk_freq_hz / i;
|
||||
dev_dbg(dev, "mul %d / div %d\n", mul, div);
|
||||
dev_dbg(dev, "mul %u / div %u\n", mul, div);
|
||||
|
||||
min_pre_pll_clk_div =
|
||||
max_t(uint16_t, min_pre_pll_clk_div,
|
||||
clk_div_even_up(
|
||||
DIV_ROUND_UP(mul * pll->ext_clk_freq_hz,
|
||||
limits->max_pll_op_freq_hz)));
|
||||
dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %d / %d\n",
|
||||
dev_dbg(dev, "pll_op check: min / max pre_pll_clk_div: %u / %u\n",
|
||||
min_pre_pll_clk_div, max_pre_pll_clk_div);
|
||||
|
||||
for (pll->pre_pll_clk_div = min_pre_pll_clk_div;
|
||||
pll->pre_pll_clk_div <= max_pre_pll_clk_div;
|
||||
pll->pre_pll_clk_div += 2 - (pll->pre_pll_clk_div & 1)) {
|
||||
rval = __smiapp_pll_calculate(dev, limits, pll, mul, div,
|
||||
rval = __smiapp_pll_calculate(dev, limits, op_limits, pll,
|
||||
op_pll, mul, div,
|
||||
lane_op_clock_ratio);
|
||||
if (rval)
|
||||
continue;
|
||||
|
@@ -35,6 +35,13 @@
|
||||
#define SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0)
|
||||
#define SMIAPP_PLL_FLAG_NO_OP_CLOCKS (1 << 1)
|
||||
|
||||
struct smiapp_pll_branch {
|
||||
uint16_t sys_clk_div;
|
||||
uint16_t pix_clk_div;
|
||||
uint32_t sys_clk_freq_hz;
|
||||
uint32_t pix_clk_freq_hz;
|
||||
};
|
||||
|
||||
struct smiapp_pll {
|
||||
/* input values */
|
||||
uint8_t bus_type;
|
||||
@@ -53,24 +60,18 @@ struct smiapp_pll {
|
||||
uint8_t scale_n;
|
||||
uint8_t bits_per_pixel;
|
||||
uint32_t link_freq;
|
||||
uint32_t ext_clk_freq_hz;
|
||||
|
||||
/* output values */
|
||||
uint16_t pre_pll_clk_div;
|
||||
uint16_t pll_multiplier;
|
||||
uint16_t op_sys_clk_div;
|
||||
uint16_t op_pix_clk_div;
|
||||
uint16_t vt_sys_clk_div;
|
||||
uint16_t vt_pix_clk_div;
|
||||
|
||||
uint32_t ext_clk_freq_hz;
|
||||
uint32_t pll_ip_clk_freq_hz;
|
||||
uint32_t pll_op_clk_freq_hz;
|
||||
uint32_t op_sys_clk_freq_hz;
|
||||
uint32_t op_pix_clk_freq_hz;
|
||||
uint32_t vt_sys_clk_freq_hz;
|
||||
uint32_t vt_pix_clk_freq_hz;
|
||||
struct smiapp_pll_branch vt;
|
||||
struct smiapp_pll_branch op;
|
||||
|
||||
uint32_t pixel_rate_csi;
|
||||
uint32_t pixel_rate_pixel_array;
|
||||
};
|
||||
|
||||
struct smiapp_pll_branch_limits {
|
||||
|
@@ -205,12 +205,12 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor)
|
||||
int rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt_pix_clk_div);
|
||||
sensor, SMIAPP_REG_U16_VT_PIX_CLK_DIV, pll->vt.pix_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt_sys_clk_div);
|
||||
sensor, SMIAPP_REG_U16_VT_SYS_CLK_DIV, pll->vt.sys_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
@@ -227,20 +227,21 @@ static int smiapp_pll_configure(struct smiapp_sensor *sensor)
|
||||
/* Lane op clock ratio does not apply here. */
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U32_REQUESTED_LINK_BIT_RATE_MBPS,
|
||||
DIV_ROUND_UP(pll->op_sys_clk_freq_hz, 1000000 / 256 / 256));
|
||||
DIV_ROUND_UP(pll->op.sys_clk_freq_hz, 1000000 / 256 / 256));
|
||||
if (rval < 0 || sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op_pix_clk_div);
|
||||
sensor, SMIAPP_REG_U16_OP_PIX_CLK_DIV, pll->op.pix_clk_div);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
return smiapp_write(
|
||||
sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op_sys_clk_div);
|
||||
sensor, SMIAPP_REG_U16_OP_SYS_CLK_DIV, pll->op.sys_clk_div);
|
||||
}
|
||||
|
||||
static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
static int smiapp_pll_try(struct smiapp_sensor *sensor,
|
||||
struct smiapp_pll *pll)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct smiapp_pll_limits lim = {
|
||||
@@ -274,19 +275,15 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
.min_line_length_pck_bin = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN],
|
||||
.min_line_length_pck = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK],
|
||||
};
|
||||
|
||||
return smiapp_pll_calculate(&client->dev, &lim, pll);
|
||||
}
|
||||
|
||||
static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct smiapp_pll *pll = &sensor->pll;
|
||||
int rval;
|
||||
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0) {
|
||||
/*
|
||||
* Fill in operational clock divisors limits from the
|
||||
* video timing ones. On profile 0 sensors the
|
||||
* requirements regarding them are essentially the
|
||||
* same as on VT ones.
|
||||
*/
|
||||
lim.op = lim.vt;
|
||||
}
|
||||
|
||||
pll->binning_horizontal = sensor->binning_horizontal;
|
||||
pll->binning_vertical = sensor->binning_vertical;
|
||||
pll->link_freq =
|
||||
@@ -294,12 +291,12 @@ static int smiapp_pll_update(struct smiapp_sensor *sensor)
|
||||
pll->scale_m = sensor->scale_m;
|
||||
pll->bits_per_pixel = sensor->csi_format->compressed;
|
||||
|
||||
rval = smiapp_pll_calculate(&client->dev, &lim, pll);
|
||||
rval = smiapp_pll_try(sensor, pll);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_parray,
|
||||
pll->vt_pix_clk_freq_hz);
|
||||
pll->pixel_rate_pixel_array);
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->pixel_rate_csi, pll->pixel_rate_csi);
|
||||
|
||||
return 0;
|
||||
@@ -333,22 +330,22 @@ static void __smiapp_update_exposure_limits(struct smiapp_sensor *sensor)
|
||||
* orders must be defined.
|
||||
*/
|
||||
static const struct smiapp_csi_data_format smiapp_csi_data_formats[] = {
|
||||
{ V4L2_MBUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ V4L2_MBUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ V4L2_MBUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ V4L2_MBUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ V4L2_MBUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG12_1X12, 12, 12, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG10_1X10, 10, 10, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8, 10, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
{ MEDIA_BUS_FMT_SGRBG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GRBG, },
|
||||
{ MEDIA_BUS_FMT_SRGGB8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_RGGB, },
|
||||
{ MEDIA_BUS_FMT_SBGGR8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_BGGR, },
|
||||
{ MEDIA_BUS_FMT_SGBRG8_1X8, 8, 8, SMIAPP_PIXEL_ORDER_GBRG, },
|
||||
};
|
||||
|
||||
const char *pixel_order_str[] = { "GRBG", "RGGB", "BGGR", "GBRG" };
|
||||
@@ -526,6 +523,8 @@ static const struct v4l2_ctrl_ops smiapp_ctrl_ops = {
|
||||
static int smiapp_init_controls(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned long *valid_link_freqs = &sensor->valid_link_freqs[
|
||||
sensor->csi_format->compressed - SMIAPP_COMPRESSED_BASE];
|
||||
unsigned int max, i;
|
||||
int rval;
|
||||
|
||||
@@ -608,8 +607,8 @@ static int smiapp_init_controls(struct smiapp_sensor *sensor)
|
||||
|
||||
sensor->link_freq = v4l2_ctrl_new_int_menu(
|
||||
&sensor->src->ctrl_handler, &smiapp_ctrl_ops,
|
||||
V4L2_CID_LINK_FREQ, max, 0,
|
||||
sensor->platform_data->op_sys_clock);
|
||||
V4L2_CID_LINK_FREQ, __fls(*valid_link_freqs),
|
||||
__ffs(*valid_link_freqs), sensor->platform_data->op_sys_clock);
|
||||
|
||||
sensor->pixel_rate_csi = v4l2_ctrl_new_std(
|
||||
&sensor->src->ctrl_handler, &smiapp_ctrl_ops,
|
||||
@@ -745,6 +744,7 @@ static int smiapp_get_limits_binning(struct smiapp_sensor *sensor)
|
||||
static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
struct smiapp_pll *pll = &sensor->pll;
|
||||
unsigned int type, n;
|
||||
unsigned int i, pixel_order;
|
||||
int rval;
|
||||
@@ -808,14 +808,57 @@ static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
||||
dev_dbg(&client->dev, "jolly good! %d\n", j);
|
||||
|
||||
sensor->default_mbus_frame_fmts |= 1 << j;
|
||||
if (!sensor->csi_format
|
||||
|| f->width > sensor->csi_format->width
|
||||
|| (f->width == sensor->csi_format->width
|
||||
&& f->compressed
|
||||
> sensor->csi_format->compressed)) {
|
||||
sensor->csi_format = f;
|
||||
sensor->internal_csi_format = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Figure out which BPP values can be used with which formats. */
|
||||
pll->binning_horizontal = 1;
|
||||
pll->binning_vertical = 1;
|
||||
pll->scale_m = sensor->scale_m;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(smiapp_csi_data_formats); i++) {
|
||||
const struct smiapp_csi_data_format *f =
|
||||
&smiapp_csi_data_formats[i];
|
||||
unsigned long *valid_link_freqs =
|
||||
&sensor->valid_link_freqs[
|
||||
f->compressed - SMIAPP_COMPRESSED_BASE];
|
||||
unsigned int j;
|
||||
|
||||
BUG_ON(f->compressed < SMIAPP_COMPRESSED_BASE);
|
||||
BUG_ON(f->compressed > SMIAPP_COMPRESSED_MAX);
|
||||
|
||||
if (!(sensor->default_mbus_frame_fmts & 1 << i))
|
||||
continue;
|
||||
|
||||
pll->bits_per_pixel = f->compressed;
|
||||
|
||||
for (j = 0; sensor->platform_data->op_sys_clock[j]; j++) {
|
||||
pll->link_freq = sensor->platform_data->op_sys_clock[j];
|
||||
|
||||
rval = smiapp_pll_try(sensor, pll);
|
||||
dev_dbg(&client->dev, "link freq %u Hz, bpp %u %s\n",
|
||||
pll->link_freq, pll->bits_per_pixel,
|
||||
rval ? "not ok" : "ok");
|
||||
if (rval)
|
||||
continue;
|
||||
|
||||
set_bit(j, valid_link_freqs);
|
||||
}
|
||||
|
||||
if (!*valid_link_freqs) {
|
||||
dev_info(&client->dev,
|
||||
"no valid link frequencies for %u bpp\n",
|
||||
f->compressed);
|
||||
sensor->default_mbus_frame_fmts &= ~BIT(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!sensor->csi_format
|
||||
|| f->width > sensor->csi_format->width
|
||||
|| (f->width == sensor->csi_format->width
|
||||
&& f->compressed > sensor->csi_format->compressed)) {
|
||||
sensor->csi_format = f;
|
||||
sensor->internal_csi_format = f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -904,7 +947,7 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor)
|
||||
dev_dbg(&client->dev, "hblank\t\t%d\n", sensor->hblank->val);
|
||||
|
||||
dev_dbg(&client->dev, "real timeperframe\t100/%d\n",
|
||||
sensor->pll.vt_pix_clk_freq_hz /
|
||||
sensor->pll.pixel_rate_pixel_array /
|
||||
((sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width
|
||||
+ sensor->hblank->val) *
|
||||
(sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height
|
||||
@@ -1687,6 +1730,59 @@ static const struct smiapp_csi_data_format
|
||||
return csi_format;
|
||||
}
|
||||
|
||||
static int smiapp_set_format_source(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
{
|
||||
struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
|
||||
const struct smiapp_csi_data_format *csi_format,
|
||||
*old_csi_format = sensor->csi_format;
|
||||
unsigned long *valid_link_freqs;
|
||||
u32 code = fmt->format.code;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
rval = __smiapp_get_format(subdev, fh, fmt);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
/*
|
||||
* Media bus code is changeable on src subdev's source pad. On
|
||||
* other source pads we just get format here.
|
||||
*/
|
||||
if (subdev != &sensor->src->sd)
|
||||
return 0;
|
||||
|
||||
csi_format = smiapp_validate_csi_data_format(sensor, code);
|
||||
|
||||
fmt->format.code = csi_format->code;
|
||||
|
||||
if (fmt->which != V4L2_SUBDEV_FORMAT_ACTIVE)
|
||||
return 0;
|
||||
|
||||
sensor->csi_format = csi_format;
|
||||
|
||||
if (csi_format->width != old_csi_format->width)
|
||||
for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
|
||||
__v4l2_ctrl_modify_range(
|
||||
sensor->test_data[i], 0,
|
||||
(1 << csi_format->width) - 1, 1, 0);
|
||||
|
||||
if (csi_format->compressed == old_csi_format->compressed)
|
||||
return 0;
|
||||
|
||||
valid_link_freqs =
|
||||
&sensor->valid_link_freqs[sensor->csi_format->compressed
|
||||
- SMIAPP_COMPRESSED_BASE];
|
||||
|
||||
__v4l2_ctrl_modify_range(
|
||||
sensor->link_freq, 0,
|
||||
__fls(*valid_link_freqs), ~*valid_link_freqs,
|
||||
__ffs(*valid_link_freqs));
|
||||
|
||||
return smiapp_pll_update(sensor);
|
||||
}
|
||||
|
||||
static int smiapp_set_format(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_fh *fh,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
@@ -1697,41 +1793,14 @@ static int smiapp_set_format(struct v4l2_subdev *subdev,
|
||||
|
||||
mutex_lock(&sensor->mutex);
|
||||
|
||||
/*
|
||||
* Media bus code is changeable on src subdev's source pad. On
|
||||
* other source pads we just get format here.
|
||||
*/
|
||||
if (fmt->pad == ssd->source_pad) {
|
||||
u32 code = fmt->format.code;
|
||||
int rval = __smiapp_get_format(subdev, fh, fmt);
|
||||
bool range_changed = false;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
if (!rval && subdev == &sensor->src->sd) {
|
||||
const struct smiapp_csi_data_format *csi_format =
|
||||
smiapp_validate_csi_data_format(sensor, code);
|
||||
|
||||
if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
|
||||
if (csi_format->width !=
|
||||
sensor->csi_format->width)
|
||||
range_changed = true;
|
||||
|
||||
sensor->csi_format = csi_format;
|
||||
}
|
||||
|
||||
fmt->format.code = csi_format->code;
|
||||
}
|
||||
rval = smiapp_set_format_source(subdev, fh, fmt);
|
||||
|
||||
mutex_unlock(&sensor->mutex);
|
||||
if (rval || !range_changed)
|
||||
return rval;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(sensor->test_data); i++)
|
||||
v4l2_ctrl_modify_range(
|
||||
sensor->test_data[i],
|
||||
0, (1 << sensor->csi_format->width) - 1, 1, 0);
|
||||
|
||||
return 0;
|
||||
return rval;
|
||||
}
|
||||
|
||||
/* Sink pad. Width and height are changeable here. */
|
||||
@@ -2023,6 +2092,11 @@ static int __smiapp_sel_supported(struct v4l2_subdev *subdev,
|
||||
== SMIAPP_DIGITAL_CROP_CAPABILITY_INPUT_CROP)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
case V4L2_SEL_TGT_NATIVE_SIZE:
|
||||
if (ssd == sensor->pixel_array
|
||||
&& sel->pad == SMIAPP_PA_PAD_SRC)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
case V4L2_SEL_TGT_COMPOSE:
|
||||
case V4L2_SEL_TGT_COMPOSE_BOUNDS:
|
||||
if (sel->pad == ssd->source_pad)
|
||||
@@ -2121,7 +2195,9 @@ static int __smiapp_get_selection(struct v4l2_subdev *subdev,
|
||||
|
||||
switch (sel->target) {
|
||||
case V4L2_SEL_TGT_CROP_BOUNDS:
|
||||
case V4L2_SEL_TGT_NATIVE_SIZE:
|
||||
if (ssd == sensor->pixel_array) {
|
||||
sel->r.left = sel->r.top = 0;
|
||||
sel->r.width =
|
||||
sensor->limits[SMIAPP_LIMIT_X_ADDR_MAX] + 1;
|
||||
sel->r.height =
|
||||
@@ -2482,12 +2558,6 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
||||
goto out_power_off;
|
||||
}
|
||||
|
||||
rval = smiapp_get_mbus_formats(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
goto out_power_off;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY]) {
|
||||
u32 val;
|
||||
|
||||
@@ -2569,6 +2639,22 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
||||
|
||||
sensor->scale_m = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
|
||||
/* prepare PLL configuration input values */
|
||||
pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
|
||||
pll->csi2.lanes = sensor->platform_data->lanes;
|
||||
pll->ext_clk_freq_hz = sensor->platform_data->ext_clk;
|
||||
pll->flags = smiapp_call_quirk(sensor, pll_flags);
|
||||
pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
/* Profile 0 sensors have no separate OP clock branch. */
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
|
||||
|
||||
rval = smiapp_get_mbus_formats(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
goto out_nvm_release;
|
||||
}
|
||||
|
||||
for (i = 0; i < SMIAPP_SUBDEVS; i++) {
|
||||
struct {
|
||||
struct smiapp_subdev *ssd;
|
||||
@@ -2666,18 +2752,9 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
||||
if (rval < 0)
|
||||
goto out_nvm_release;
|
||||
|
||||
/* prepare PLL configuration input values */
|
||||
pll->bus_type = SMIAPP_PLL_BUS_TYPE_CSI2;
|
||||
pll->csi2.lanes = sensor->platform_data->lanes;
|
||||
pll->ext_clk_freq_hz = sensor->platform_data->ext_clk;
|
||||
pll->flags = smiapp_call_quirk(sensor, pll_flags);
|
||||
|
||||
/* Profile 0 sensors have no separate OP clock branch. */
|
||||
if (sensor->minfo.smiapp_profile == SMIAPP_PROFILE_0)
|
||||
pll->flags |= SMIAPP_PLL_FLAG_NO_OP_CLOCKS;
|
||||
pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN];
|
||||
|
||||
mutex_lock(&sensor->mutex);
|
||||
rval = smiapp_update_mode(sensor);
|
||||
mutex_unlock(&sensor->mutex);
|
||||
if (rval) {
|
||||
dev_err(&client->dev, "update mode failed\n");
|
||||
goto out_nvm_release;
|
||||
|
@@ -156,6 +156,11 @@ struct smiapp_csi_data_format {
|
||||
#define SMIAPP_PAD_SRC 1
|
||||
#define SMIAPP_PADS 2
|
||||
|
||||
#define SMIAPP_COMPRESSED_BASE 8
|
||||
#define SMIAPP_COMPRESSED_MAX 12
|
||||
#define SMIAPP_NR_OF_COMPRESSED (SMIAPP_COMPRESSED_MAX - \
|
||||
SMIAPP_COMPRESSED_BASE + 1)
|
||||
|
||||
struct smiapp_binning_subtype {
|
||||
u8 horizontal:4;
|
||||
u8 vertical:4;
|
||||
@@ -232,6 +237,9 @@ struct smiapp_sensor {
|
||||
|
||||
struct smiapp_pll pll;
|
||||
|
||||
/* Is a default format supported for a given BPP? */
|
||||
unsigned long valid_link_freqs[SMIAPP_NR_OF_COMPRESSED];
|
||||
|
||||
/* Pixel array controls */
|
||||
struct v4l2_ctrl *analog_gain;
|
||||
struct v4l2_ctrl *exposure;
|
||||
|
@@ -71,7 +71,7 @@
|
||||
|
||||
/* IMX074 has only one fixed colorspace per pixelcode */
|
||||
struct imx074_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
@@ -82,7 +82,7 @@ struct imx074 {
|
||||
};
|
||||
|
||||
static const struct imx074_datafmt imx074_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static struct imx074 *to_imx074(const struct i2c_client *client)
|
||||
@@ -91,7 +91,7 @@ static struct imx074 *to_imx074(const struct i2c_client *client)
|
||||
}
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct imx074_datafmt *imx074_find_datafmt(enum v4l2_mbus_pixelcode code)
|
||||
static const struct imx074_datafmt *imx074_find_datafmt(u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -236,7 +236,7 @@ static int imx074_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
|
||||
}
|
||||
|
||||
static int imx074_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if ((unsigned int)index >= ARRAY_SIZE(imx074_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
@@ -53,13 +53,13 @@
|
||||
|
||||
/* MT9M001 has only one fixed colorspace per pixelcode */
|
||||
struct mt9m001_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct mt9m001_datafmt *mt9m001_find_datafmt(
|
||||
enum v4l2_mbus_pixelcode code, const struct mt9m001_datafmt *fmt,
|
||||
u32 code, const struct mt9m001_datafmt *fmt,
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
@@ -75,14 +75,14 @@ static const struct mt9m001_datafmt mt9m001_colour_fmts[] = {
|
||||
* Order important: first natively supported,
|
||||
* second supported with a GPIO extender
|
||||
*/
|
||||
{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static const struct mt9m001_datafmt mt9m001_monochrome_fmts[] = {
|
||||
/* Order important - see above */
|
||||
{V4L2_MBUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
struct mt9m001 {
|
||||
@@ -563,7 +563,7 @@ static struct v4l2_subdev_core_ops mt9m001_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int mt9m001_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9m001 *mt9m001 = to_mt9m001(client);
|
||||
|
@@ -182,23 +182,23 @@ static struct mt9m111_context context_b = {
|
||||
|
||||
/* MT9M111 has only one fixed colorspace per pixelcode */
|
||||
struct mt9m111_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
static const struct mt9m111_datafmt mt9m111_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_VYUY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_BGR565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_BGR565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
struct mt9m111 {
|
||||
@@ -218,7 +218,7 @@ struct mt9m111 {
|
||||
|
||||
/* Find a data format by a pixel code */
|
||||
static const struct mt9m111_datafmt *mt9m111_find_datafmt(struct mt9m111 *mt9m111,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < ARRAY_SIZE(mt9m111_colour_fmts); i++)
|
||||
@@ -331,7 +331,7 @@ static int mt9m111_setup_rect_ctx(struct mt9m111 *mt9m111,
|
||||
}
|
||||
|
||||
static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rect,
|
||||
int width, int height, enum v4l2_mbus_pixelcode code)
|
||||
int width, int height, u32 code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
|
||||
int ret;
|
||||
@@ -345,7 +345,7 @@ static int mt9m111_setup_geometry(struct mt9m111 *mt9m111, struct v4l2_rect *rec
|
||||
if (!ret)
|
||||
ret = reg_write(WINDOW_HEIGHT, rect->height);
|
||||
|
||||
if (code != V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (code != MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* IFP in use, down-scaling possible */
|
||||
if (!ret)
|
||||
ret = mt9m111_setup_rect_ctx(mt9m111, &context_b,
|
||||
@@ -393,8 +393,8 @@ static int mt9m111_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a)
|
||||
if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
|
||||
return -EINVAL;
|
||||
|
||||
if (mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
mt9m111->fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
mt9m111->fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* Bayer format - even size lengths */
|
||||
rect.width = ALIGN(rect.width, 2);
|
||||
rect.height = ALIGN(rect.height, 2);
|
||||
@@ -462,7 +462,7 @@ static int mt9m111_g_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
|
||||
u16 data_outfmt2, mask_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
|
||||
@@ -474,46 +474,46 @@ static int mt9m111_set_pixfmt(struct mt9m111 *mt9m111,
|
||||
int ret;
|
||||
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_PROCESSED_BAYER |
|
||||
MT9M111_OUTFMT_RGB;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_BYPASS_IFP | MT9M111_OUTFMT_RGB;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB555;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_BE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_BGR565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_BGR565_2X8_LE:
|
||||
data_outfmt2 = MT9M111_OUTFMT_RGB | MT9M111_OUTFMT_RGB565 |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
data_outfmt2 = 0;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
data_outfmt2 = MT9M111_OUTFMT_SWAP_YCbCr_C_Y_RGB_EVEN |
|
||||
MT9M111_OUTFMT_SWAP_YCbCr_Cb_Cr_RGB_R_B;
|
||||
break;
|
||||
@@ -542,8 +542,8 @@ static int mt9m111_try_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
fmt = mt9m111_find_datafmt(mt9m111, mf->code);
|
||||
|
||||
bayer = fmt->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE;
|
||||
bayer = fmt->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE;
|
||||
|
||||
/*
|
||||
* With Bayer format enforce even side lengths, but let the user play
|
||||
@@ -554,7 +554,7 @@ static int mt9m111_try_fmt(struct v4l2_subdev *sd,
|
||||
rect->height = ALIGN(rect->height, 2);
|
||||
}
|
||||
|
||||
if (fmt->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
if (fmt->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE) {
|
||||
/* IFP bypass mode, no scaling */
|
||||
mf->width = rect->width;
|
||||
mf->height = rect->height;
|
||||
@@ -840,7 +840,7 @@ static struct v4l2_subdev_core_ops mt9m111_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int mt9m111_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(mt9m111_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
@@ -345,7 +345,7 @@ static int mt9t031_g_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
mf->width = mt9t031->rect.width / mt9t031->xskip;
|
||||
mf->height = mt9t031->rect.height / mt9t031->yskip;
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
@@ -367,7 +367,7 @@ static int mt9t031_s_fmt(struct v4l2_subdev *sd,
|
||||
xskip = mt9t031_skip(&rect.width, mf->width, MT9T031_MAX_WIDTH);
|
||||
yskip = mt9t031_skip(&rect.height, mf->height, MT9T031_MAX_HEIGHT);
|
||||
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
/* mt9t031_set_params() doesn't change width and height */
|
||||
@@ -385,7 +385,7 @@ static int mt9t031_try_fmt(struct v4l2_subdev *sd,
|
||||
&mf->width, MT9T031_MIN_WIDTH, MT9T031_MAX_WIDTH, 1,
|
||||
&mf->height, MT9T031_MIN_HEIGHT, MT9T031_MAX_HEIGHT, 1, 0);
|
||||
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
return 0;
|
||||
@@ -673,12 +673,12 @@ static struct v4l2_subdev_core_ops mt9t031_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int mt9t031_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
*code = MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -77,7 +77,7 @@
|
||||
struct
|
||||
************************************************************************/
|
||||
struct mt9t112_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u16 fmt;
|
||||
u16 order;
|
||||
@@ -103,32 +103,32 @@ struct mt9t112_priv {
|
||||
|
||||
static const struct mt9t112_format mt9t112_cfmts[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 0,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 1,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 2,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.fmt = 1,
|
||||
.order = 3,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.fmt = 8,
|
||||
.order = 2,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.fmt = 4,
|
||||
.order = 2,
|
||||
@@ -840,7 +840,7 @@ static int mt9t112_s_stream(struct v4l2_subdev *sd, int enable)
|
||||
|
||||
static int mt9t112_set_params(struct mt9t112_priv *priv,
|
||||
const struct v4l2_rect *rect,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -953,7 +953,7 @@ static int mt9t112_try_fmt(struct v4l2_subdev *sd,
|
||||
break;
|
||||
|
||||
if (i == priv->num_formats) {
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
} else {
|
||||
mf->colorspace = mt9t112_cfmts[i].colorspace;
|
||||
@@ -967,7 +967,7 @@ static int mt9t112_try_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int mt9t112_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9t112_priv *priv = to_mt9t112(client);
|
||||
@@ -1101,7 +1101,7 @@ static int mt9t112_probe(struct i2c_client *client,
|
||||
|
||||
/* Cannot fail: using the default supported pixel code */
|
||||
if (!ret)
|
||||
mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8);
|
||||
mt9t112_set_params(priv, &rect, MEDIA_BUS_FMT_UYVY8_2X8);
|
||||
else
|
||||
v4l2_clk_put(priv->clk);
|
||||
|
||||
|
@@ -85,13 +85,13 @@ MODULE_PARM_DESC(sensor_type, "Sensor type: \"colour\" or \"monochrome\"");
|
||||
|
||||
/* MT9V022 has only one fixed colorspace per pixelcode */
|
||||
struct mt9v022_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct mt9v022_datafmt *mt9v022_find_datafmt(
|
||||
enum v4l2_mbus_pixelcode code, const struct mt9v022_datafmt *fmt,
|
||||
u32 code, const struct mt9v022_datafmt *fmt,
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
@@ -107,14 +107,14 @@ static const struct mt9v022_datafmt mt9v022_colour_fmts[] = {
|
||||
* Order important: first natively supported,
|
||||
* second supported with a GPIO extender
|
||||
*/
|
||||
{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR8_1X8, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
static const struct mt9v022_datafmt mt9v022_monochrome_fmts[] = {
|
||||
/* Order important - see above */
|
||||
{V4L2_MBUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y10_1X10, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_Y8_1X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
/* only registers with different addresses on different mt9v02x sensors */
|
||||
@@ -410,13 +410,13 @@ static int mt9v022_s_fmt(struct v4l2_subdev *sd,
|
||||
* .try_mbus_fmt(), datawidth is from our supported format list
|
||||
*/
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case V4L2_MBUS_FMT_Y10_1X10:
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_Y10_1X10:
|
||||
if (mt9v022->model != MT9V022IX7ATM)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case V4L2_MBUS_FMT_SBGGR10_1X10:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR10_1X10:
|
||||
if (mt9v022->model != MT9V022IX7ATC)
|
||||
return -EINVAL;
|
||||
break;
|
||||
@@ -443,8 +443,8 @@ static int mt9v022_try_fmt(struct v4l2_subdev *sd,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9v022 *mt9v022 = to_mt9v022(client);
|
||||
const struct mt9v022_datafmt *fmt;
|
||||
int align = mf->code == V4L2_MBUS_FMT_SBGGR8_1X8 ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_1X10;
|
||||
int align = mf->code == MEDIA_BUS_FMT_SBGGR8_1X8 ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_1X10;
|
||||
|
||||
v4l_bound_align_image(&mf->width, MT9V022_MIN_WIDTH,
|
||||
MT9V022_MAX_WIDTH, align,
|
||||
@@ -759,7 +759,7 @@ static struct v4l2_subdev_core_ops mt9v022_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int mt9v022_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct mt9v022 *mt9v022 = to_mt9v022(client);
|
||||
|
@@ -302,7 +302,7 @@ struct ov2640_win_size {
|
||||
struct ov2640_priv {
|
||||
struct v4l2_subdev subdev;
|
||||
struct v4l2_ctrl_handler hdl;
|
||||
enum v4l2_mbus_pixelcode cfmt_code;
|
||||
u32 cfmt_code;
|
||||
struct v4l2_clk *clk;
|
||||
const struct ov2640_win_size *win;
|
||||
};
|
||||
@@ -623,11 +623,11 @@ static const struct regval_list ov2640_rgb565_le_regs[] = {
|
||||
ENDMARKER,
|
||||
};
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov2640_codes[] = {
|
||||
V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
static u32 ov2640_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -785,7 +785,7 @@ static const struct ov2640_win_size *ov2640_select_win(u32 *width, u32 *height)
|
||||
}
|
||||
|
||||
static int ov2640_set_params(struct i2c_client *client, u32 *width, u32 *height,
|
||||
enum v4l2_mbus_pixelcode code)
|
||||
u32 code)
|
||||
{
|
||||
struct ov2640_priv *priv = to_ov2640(client);
|
||||
const struct regval_list *selected_cfmt_regs;
|
||||
@@ -797,20 +797,20 @@ static int ov2640_set_params(struct i2c_client *client, u32 *width, u32 *height,
|
||||
/* select format */
|
||||
priv->cfmt_code = 0;
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt RGB565 BE", __func__);
|
||||
selected_cfmt_regs = ov2640_rgb565_be_regs;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt RGB565 LE", __func__);
|
||||
selected_cfmt_regs = ov2640_rgb565_le_regs;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt YUYV (YUV422)", __func__);
|
||||
selected_cfmt_regs = ov2640_yuyv_regs;
|
||||
break;
|
||||
default:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
dev_dbg(&client->dev, "%s: Selected cfmt UYVY", __func__);
|
||||
selected_cfmt_regs = ov2640_uyvy_regs;
|
||||
}
|
||||
@@ -869,7 +869,7 @@ static int ov2640_g_fmt(struct v4l2_subdev *sd,
|
||||
if (!priv->win) {
|
||||
u32 width = W_SVGA, height = H_SVGA;
|
||||
priv->win = ov2640_select_win(&width, &height);
|
||||
priv->cfmt_code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
priv->cfmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
}
|
||||
|
||||
mf->width = priv->win->width;
|
||||
@@ -877,13 +877,13 @@ static int ov2640_g_fmt(struct v4l2_subdev *sd,
|
||||
mf->code = priv->cfmt_code;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
@@ -899,14 +899,14 @@ static int ov2640_s_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
@@ -926,14 +926,14 @@ static int ov2640_try_fmt(struct v4l2_subdev *sd,
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
@@ -941,7 +941,7 @@ static int ov2640_try_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int ov2640_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov2640_codes))
|
||||
return -EINVAL;
|
||||
|
@@ -602,7 +602,7 @@ static struct regval_list ov5642_default_regs_finalise[] = {
|
||||
};
|
||||
|
||||
struct ov5642_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
@@ -618,7 +618,7 @@ struct ov5642 {
|
||||
};
|
||||
|
||||
static const struct ov5642_datafmt ov5642_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
};
|
||||
|
||||
static struct ov5642 *to_ov5642(const struct i2c_client *client)
|
||||
@@ -628,7 +628,7 @@ static struct ov5642 *to_ov5642(const struct i2c_client *client)
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct ov5642_datafmt
|
||||
*ov5642_find_datafmt(enum v4l2_mbus_pixelcode code)
|
||||
*ov5642_find_datafmt(u32 code)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -840,7 +840,7 @@ static int ov5642_g_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int ov5642_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov5642_colour_fmts))
|
||||
return -EINVAL;
|
||||
|
@@ -202,18 +202,18 @@ struct ov6650 {
|
||||
unsigned long pclk_limit; /* from host */
|
||||
unsigned long pclk_max; /* from resolution and format */
|
||||
struct v4l2_fract tpf; /* as requested with s_parm */
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov6650_codes[] = {
|
||||
V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
V4L2_MBUS_FMT_SBGGR8_1X8,
|
||||
V4L2_MBUS_FMT_Y8_1X8,
|
||||
static u32 ov6650_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
MEDIA_BUS_FMT_SBGGR8_1X8,
|
||||
MEDIA_BUS_FMT_Y8_1X8,
|
||||
};
|
||||
|
||||
/* read a register */
|
||||
@@ -555,29 +555,29 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
.height = mf->height << half_scale,
|
||||
},
|
||||
};
|
||||
enum v4l2_mbus_pixelcode code = mf->code;
|
||||
u32 code = mf->code;
|
||||
unsigned long mclk, pclk;
|
||||
u8 coma_set = 0, coma_mask = 0, coml_set, coml_mask, clkrc;
|
||||
int ret;
|
||||
|
||||
/* select color matrix configuration for given color encoding */
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
dev_dbg(&client->dev, "pixel format GREY8_1X8\n");
|
||||
coma_mask |= COMA_RGB | COMA_WORD_SWAP | COMA_BYTE_SWAP;
|
||||
coma_set |= COMA_BW;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YUYV8_2X8_LE\n");
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_BYTE_SWAP;
|
||||
coma_set |= COMA_WORD_SWAP;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YVYU8_2X8_LE (untested)\n");
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_WORD_SWAP |
|
||||
COMA_BYTE_SWAP;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YUYV8_2X8_BE\n");
|
||||
if (half_scale) {
|
||||
coma_mask |= COMA_RGB | COMA_BW | COMA_WORD_SWAP;
|
||||
@@ -587,7 +587,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
coma_set |= COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
||||
}
|
||||
break;
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
dev_dbg(&client->dev, "pixel format YVYU8_2X8_BE (untested)\n");
|
||||
if (half_scale) {
|
||||
coma_mask |= COMA_RGB | COMA_BW;
|
||||
@@ -597,7 +597,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
coma_set |= COMA_BYTE_SWAP;
|
||||
}
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
dev_dbg(&client->dev, "pixel format SBGGR8_1X8 (untested)\n");
|
||||
coma_mask |= COMA_BW | COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
||||
coma_set |= COMA_RAW_RGB | COMA_RGB;
|
||||
@@ -608,8 +608,8 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
}
|
||||
priv->code = code;
|
||||
|
||||
if (code == V4L2_MBUS_FMT_Y8_1X8 ||
|
||||
code == V4L2_MBUS_FMT_SBGGR8_1X8) {
|
||||
if (code == MEDIA_BUS_FMT_Y8_1X8 ||
|
||||
code == MEDIA_BUS_FMT_SBGGR8_1X8) {
|
||||
coml_mask = COML_ONE_CHANNEL;
|
||||
coml_set = 0;
|
||||
priv->pclk_max = 4000000;
|
||||
@@ -619,7 +619,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
priv->pclk_max = 8000000;
|
||||
}
|
||||
|
||||
if (code == V4L2_MBUS_FMT_SBGGR8_1X8)
|
||||
if (code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
priv->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
else if (code != 0)
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
@@ -697,18 +697,18 @@ static int ov6650_try_fmt(struct v4l2_subdev *sd,
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_Y10_1X10:
|
||||
mf->code = V4L2_MBUS_FMT_Y8_1X8;
|
||||
case V4L2_MBUS_FMT_Y8_1X8:
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case V4L2_MBUS_FMT_VYUY8_2X8:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_Y10_1X10:
|
||||
mf->code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
case MEDIA_BUS_FMT_Y8_1X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_SBGGR8_1X8;
|
||||
case V4L2_MBUS_FMT_SBGGR8_1X8:
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR8_1X8;
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
}
|
||||
@@ -717,7 +717,7 @@ static int ov6650_try_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int ov6650_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov6650_codes))
|
||||
return -EINVAL;
|
||||
@@ -1013,7 +1013,7 @@ static int ov6650_probe(struct i2c_client *client,
|
||||
priv->rect.width = W_CIF;
|
||||
priv->rect.height = H_CIF;
|
||||
priv->half_scale = false;
|
||||
priv->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, "mclk");
|
||||
|
@@ -376,7 +376,7 @@
|
||||
*/
|
||||
|
||||
struct ov772x_color_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u8 dsp3;
|
||||
u8 dsp4;
|
||||
@@ -408,7 +408,7 @@ struct ov772x_priv {
|
||||
*/
|
||||
static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -416,7 +416,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = OFMT_YUV,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.dsp3 = UV_ON,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -424,7 +424,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = OFMT_YUV,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -432,7 +432,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = OFMT_YUV,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -440,7 +440,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = FMT_RGB555 | OFMT_RGB,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
|
||||
.code = MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -448,7 +448,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = FMT_RGB555 | OFMT_RGB,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -456,7 +456,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
.com7 = FMT_RGB565 | OFMT_RGB,
|
||||
},
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_YUV,
|
||||
@@ -468,7 +468,7 @@ static const struct ov772x_color_format ov772x_cfmts[] = {
|
||||
* regardless of the COM7 value. We can thus only support 10-bit
|
||||
* Bayer until someone figures it out.
|
||||
*/
|
||||
.code = V4L2_MBUS_FMT_SBGGR10_1X10,
|
||||
.code = MEDIA_BUS_FMT_SBGGR10_1X10,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.dsp3 = 0x0,
|
||||
.dsp4 = DSP_OFMT_RAW10,
|
||||
@@ -990,7 +990,7 @@ static struct v4l2_subdev_core_ops ov772x_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int ov772x_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov772x_cfmts))
|
||||
return -EINVAL;
|
||||
|
@@ -159,10 +159,10 @@ static const struct ov9640_reg ov9640_regs_rgb[] = {
|
||||
{ OV9640_MTXS, 0x65 },
|
||||
};
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov9640_codes[] = {
|
||||
V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
static u32 ov9640_codes[] = {
|
||||
MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
};
|
||||
|
||||
/* read a register */
|
||||
@@ -351,22 +351,22 @@ static void ov9640_res_roundup(u32 *width, u32 *height)
|
||||
}
|
||||
|
||||
/* Prepare necessary register changes depending on color encoding */
|
||||
static void ov9640_alter_regs(enum v4l2_mbus_pixelcode code,
|
||||
static void ov9640_alter_regs(u32 code,
|
||||
struct ov9640_reg_alt *alt)
|
||||
{
|
||||
switch (code) {
|
||||
default:
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
alt->com12 = OV9640_COM12_YUV_AVG;
|
||||
alt->com13 = OV9640_COM13_Y_DELAY_EN |
|
||||
OV9640_COM13_YUV_DLY(0x01);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
alt->com7 = OV9640_COM7_RGB;
|
||||
alt->com13 = OV9640_COM13_RGB_AVG;
|
||||
alt->com15 = OV9640_COM15_RGB_555;
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
alt->com7 = OV9640_COM7_RGB;
|
||||
alt->com13 = OV9640_COM13_RGB_AVG;
|
||||
alt->com15 = OV9640_COM15_RGB_565;
|
||||
@@ -376,7 +376,7 @@ static void ov9640_alter_regs(enum v4l2_mbus_pixelcode code,
|
||||
|
||||
/* Setup registers according to resolution and color encoding */
|
||||
static int ov9640_write_regs(struct i2c_client *client, u32 width,
|
||||
enum v4l2_mbus_pixelcode code, struct ov9640_reg_alt *alts)
|
||||
u32 code, struct ov9640_reg_alt *alts)
|
||||
{
|
||||
const struct ov9640_reg *ov9640_regs, *matrix_regs;
|
||||
int ov9640_regs_len, matrix_regs_len;
|
||||
@@ -419,7 +419,7 @@ static int ov9640_write_regs(struct i2c_client *client, u32 width,
|
||||
}
|
||||
|
||||
/* select color matrix configuration for given color encoding */
|
||||
if (code == V4L2_MBUS_FMT_UYVY8_2X8) {
|
||||
if (code == MEDIA_BUS_FMT_UYVY8_2X8) {
|
||||
matrix_regs = ov9640_regs_yuv;
|
||||
matrix_regs_len = ARRAY_SIZE(ov9640_regs_yuv);
|
||||
} else {
|
||||
@@ -487,7 +487,7 @@ static int ov9640_s_fmt(struct v4l2_subdev *sd,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov9640_reg_alt alts = {0};
|
||||
enum v4l2_colorspace cspace;
|
||||
enum v4l2_mbus_pixelcode code = mf->code;
|
||||
u32 code = mf->code;
|
||||
int ret;
|
||||
|
||||
ov9640_res_roundup(&mf->width, &mf->height);
|
||||
@@ -500,13 +500,13 @@ static int ov9640_s_fmt(struct v4l2_subdev *sd,
|
||||
return ret;
|
||||
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
cspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
cspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
@@ -527,13 +527,13 @@ static int ov9640_try_fmt(struct v4l2_subdev *sd,
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
}
|
||||
|
||||
@@ -541,7 +541,7 @@ static int ov9640_try_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
|
||||
static int ov9640_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov9640_codes))
|
||||
return -EINVAL;
|
||||
|
@@ -392,8 +392,8 @@ static const struct ov9740_reg ov9740_defaults[] = {
|
||||
{ OV9740_ISP_CTRL19, 0x02 },
|
||||
};
|
||||
|
||||
static enum v4l2_mbus_pixelcode ov9740_codes[] = {
|
||||
V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
static u32 ov9740_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
};
|
||||
|
||||
/* read a register */
|
||||
@@ -674,13 +674,13 @@ static int ov9740_s_fmt(struct v4l2_subdev *sd,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov9740_priv *priv = to_ov9740(sd);
|
||||
enum v4l2_colorspace cspace;
|
||||
enum v4l2_mbus_pixelcode code = mf->code;
|
||||
u32 code = mf->code;
|
||||
int ret;
|
||||
|
||||
ov9740_res_roundup(&mf->width, &mf->height);
|
||||
|
||||
switch (code) {
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
cspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
default:
|
||||
@@ -710,14 +710,14 @@ static int ov9740_try_fmt(struct v4l2_subdev *sd,
|
||||
ov9740_res_roundup(&mf->width, &mf->height);
|
||||
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
mf->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ov9740_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(ov9740_codes))
|
||||
return -EINVAL;
|
||||
|
@@ -111,13 +111,13 @@
|
||||
|
||||
/* RJ54N1CB0C has only one fixed colorspace per pixelcode */
|
||||
struct rj54n1_datafmt {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
/* Find a data format by a pixel code in an array */
|
||||
static const struct rj54n1_datafmt *rj54n1_find_datafmt(
|
||||
enum v4l2_mbus_pixelcode code, const struct rj54n1_datafmt *fmt,
|
||||
u32 code, const struct rj54n1_datafmt *fmt,
|
||||
int n)
|
||||
{
|
||||
int i;
|
||||
@@ -129,15 +129,15 @@ static const struct rj54n1_datafmt *rj54n1_find_datafmt(
|
||||
}
|
||||
|
||||
static const struct rj54n1_datafmt rj54n1_colour_fmts[] = {
|
||||
{V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE, V4L2_COLORSPACE_SRGB},
|
||||
{V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_YVYU8_2X8, V4L2_COLORSPACE_JPEG},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_RGB565_2X8_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE, V4L2_COLORSPACE_SRGB},
|
||||
{MEDIA_BUS_FMT_SBGGR10_1X10, V4L2_COLORSPACE_SRGB},
|
||||
};
|
||||
|
||||
struct rj54n1_clock_div {
|
||||
@@ -486,7 +486,7 @@ static int reg_write_multiple(struct i2c_client *client,
|
||||
}
|
||||
|
||||
static int rj54n1_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(rj54n1_colour_fmts))
|
||||
return -EINVAL;
|
||||
@@ -965,11 +965,11 @@ static int rj54n1_try_fmt(struct v4l2_subdev *sd,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct rj54n1 *rj54n1 = to_rj54n1(client);
|
||||
const struct rj54n1_datafmt *fmt;
|
||||
int align = mf->code == V4L2_MBUS_FMT_SBGGR10_1X10 ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE ||
|
||||
mf->code == V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE;
|
||||
int align = mf->code == MEDIA_BUS_FMT_SBGGR10_1X10 ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE ||
|
||||
mf->code == MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE;
|
||||
|
||||
dev_dbg(&client->dev, "%s: code = %d, width = %u, height = %u\n",
|
||||
__func__, mf->code, mf->width, mf->height);
|
||||
@@ -1025,55 +1025,55 @@ static int rj54n1_s_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
/* RA_SEL_UL is only relevant for raw modes, ignored otherwise. */
|
||||
switch (mf->code) {
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 0);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 8, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YVYU8_2X8:
|
||||
case MEDIA_BUS_FMT_YVYU8_2X8:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 0);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 0, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 0x11);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 8, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_BE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 0x11);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 0, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 4);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 8, 8);
|
||||
if (!ret)
|
||||
ret = reg_write(client, RJ54N1_RA_SEL_UL, 0);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 4);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 8, 8);
|
||||
if (!ret)
|
||||
ret = reg_write(client, RJ54N1_RA_SEL_UL, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 4);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 0, 8);
|
||||
if (!ret)
|
||||
ret = reg_write(client, RJ54N1_RA_SEL_UL, 0);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE:
|
||||
case MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 4);
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_BYTE_SWAP, 0, 8);
|
||||
if (!ret)
|
||||
ret = reg_write(client, RJ54N1_RA_SEL_UL, 8);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_SBGGR10_1X10:
|
||||
case MEDIA_BUS_FMT_SBGGR10_1X10:
|
||||
ret = reg_write(client, RJ54N1_OUT_SEL, 5);
|
||||
break;
|
||||
default:
|
||||
@@ -1083,7 +1083,7 @@ static int rj54n1_s_fmt(struct v4l2_subdev *sd,
|
||||
/* Special case: a raw mode with 10 bits of data per clock tick */
|
||||
if (!ret)
|
||||
ret = reg_set(client, RJ54N1_OCLK_SEL_EN,
|
||||
(mf->code == V4L2_MBUS_FMT_SBGGR10_1X10) << 1, 2);
|
||||
(mf->code == MEDIA_BUS_FMT_SBGGR10_1X10) << 1, 2);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@@ -705,7 +705,7 @@ static int tw9910_g_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
mf->width = priv->scale->width;
|
||||
mf->height = priv->scale->height;
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
mf->field = V4L2_FIELD_INTERLACED_BT;
|
||||
|
||||
@@ -724,7 +724,7 @@ static int tw9910_s_fmt(struct v4l2_subdev *sd,
|
||||
/*
|
||||
* check color format
|
||||
*/
|
||||
if (mf->code != V4L2_MBUS_FMT_UYVY8_2X8)
|
||||
if (mf->code != MEDIA_BUS_FMT_UYVY8_2X8)
|
||||
return -EINVAL;
|
||||
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
@@ -751,7 +751,7 @@ static int tw9910_try_fmt(struct v4l2_subdev *sd,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mf->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
mf->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
/*
|
||||
@@ -822,12 +822,12 @@ static struct v4l2_subdev_core_ops tw9910_subdev_core_ops = {
|
||||
};
|
||||
|
||||
static int tw9910_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
*code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -165,7 +165,7 @@ struct sr030pc30_info {
|
||||
};
|
||||
|
||||
struct sr030pc30_format {
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
u16 ispctl1_reg;
|
||||
};
|
||||
@@ -201,23 +201,23 @@ static const struct sr030pc30_frmsize sr030pc30_sizes[] = {
|
||||
/* supported pixel formats */
|
||||
static const struct sr030pc30_format sr030pc30_formats[] = {
|
||||
{
|
||||
.code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x03,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_YVYU8_2X8,
|
||||
.code = MEDIA_BUS_FMT_YVYU8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x02,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_VYUY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_VYUY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x01,
|
||||
}, {
|
||||
.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
|
||||
.code = MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
.ispctl1_reg = 0x40,
|
||||
},
|
||||
@@ -472,7 +472,7 @@ static int sr030pc30_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
}
|
||||
|
||||
static int sr030pc30_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (!code || index >= ARRAY_SIZE(sr030pc30_formats))
|
||||
return -EINVAL;
|
||||
|
@@ -756,12 +756,12 @@ static int tvp514x_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
*/
|
||||
static int
|
||||
tvp514x_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_YUYV10_2X10;
|
||||
*code = MEDIA_BUS_FMT_YUYV10_2X10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -784,7 +784,7 @@ tvp514x_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
|
||||
/* Calculate height and width based on current standard */
|
||||
current_std = decoder->current_std;
|
||||
|
||||
f->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
f->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
f->width = decoder->std_list[current_std].width;
|
||||
f->height = decoder->std_list[current_std].height;
|
||||
f->field = V4L2_FIELD_INTERLACED;
|
||||
@@ -942,7 +942,7 @@ static int tvp514x_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
if (index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
code->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -967,7 +967,7 @@ static int tvp514x_get_pad_format(struct v4l2_subdev *sd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
format->format.code = V4L2_MBUS_FMT_YUYV8_2X8;
|
||||
format->format.code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
format->format.width = tvp514x_std_list[decoder->current_std].width;
|
||||
format->format.height = tvp514x_std_list[decoder->current_std].height;
|
||||
format->format.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
@@ -991,7 +991,7 @@ static int tvp514x_set_pad_format(struct v4l2_subdev *sd,
|
||||
struct tvp514x_decoder *decoder = to_decoder(sd);
|
||||
|
||||
if (fmt->format.field != V4L2_FIELD_INTERLACED ||
|
||||
fmt->format.code != V4L2_MBUS_FMT_YUYV8_2X8 ||
|
||||
fmt->format.code != MEDIA_BUS_FMT_YUYV8_2X8 ||
|
||||
fmt->format.colorspace != V4L2_COLORSPACE_SMPTE170M ||
|
||||
fmt->format.width != tvp514x_std_list[decoder->current_std].width ||
|
||||
fmt->format.height != tvp514x_std_list[decoder->current_std].height)
|
||||
|
@@ -818,12 +818,12 @@ static v4l2_std_id tvp5150_read_std(struct v4l2_subdev *sd)
|
||||
}
|
||||
|
||||
static int tvp5150_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
|
||||
*code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
*code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -840,7 +840,7 @@ static int tvp5150_mbus_fmt(struct v4l2_subdev *sd,
|
||||
f->width = decoder->rect.width;
|
||||
f->height = decoder->rect.height;
|
||||
|
||||
f->code = V4L2_MBUS_FMT_UYVY8_2X8;
|
||||
f->code = MEDIA_BUS_FMT_UYVY8_2X8;
|
||||
f->field = V4L2_FIELD_SEQ_TB;
|
||||
f->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
|
@@ -626,7 +626,7 @@ static int tvp7002_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f
|
||||
|
||||
f->width = bt->width;
|
||||
f->height = bt->height;
|
||||
f->code = V4L2_MBUS_FMT_YUYV10_1X20;
|
||||
f->code = MEDIA_BUS_FMT_YUYV10_1X20;
|
||||
f->field = device->current_timings->scanmode;
|
||||
f->colorspace = device->current_timings->color_space;
|
||||
|
||||
@@ -756,12 +756,12 @@ static int tvp7002_s_register(struct v4l2_subdev *sd,
|
||||
*/
|
||||
|
||||
static int tvp7002_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
/* Check requested format index is within range */
|
||||
if (index)
|
||||
return -EINVAL;
|
||||
*code = V4L2_MBUS_FMT_YUYV10_1X20;
|
||||
*code = MEDIA_BUS_FMT_YUYV10_1X20;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -859,7 +859,7 @@ tvp7002_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
if (code->index != 0)
|
||||
return -EINVAL;
|
||||
|
||||
code->code = V4L2_MBUS_FMT_YUYV10_1X20;
|
||||
code->code = MEDIA_BUS_FMT_YUYV10_1X20;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -878,7 +878,7 @@ tvp7002_get_pad_format(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
||||
{
|
||||
struct tvp7002 *tvp7002 = to_tvp7002(sd);
|
||||
|
||||
fmt->format.code = V4L2_MBUS_FMT_YUYV10_1X20;
|
||||
fmt->format.code = MEDIA_BUS_FMT_YUYV10_1X20;
|
||||
fmt->format.width = tvp7002->current_timings->timings.bt.width;
|
||||
fmt->format.height = tvp7002->current_timings->timings.bt.height;
|
||||
fmt->format.field = tvp7002->current_timings->scanmode;
|
||||
|
@@ -45,19 +45,19 @@ struct vs6624 {
|
||||
};
|
||||
|
||||
static const struct vs6624_format {
|
||||
enum v4l2_mbus_pixelcode mbus_code;
|
||||
u32 mbus_code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
} vs6624_formats[] = {
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,
|
||||
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
},
|
||||
{
|
||||
.mbus_code = V4L2_MBUS_FMT_RGB565_2X8_LE,
|
||||
.mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
},
|
||||
};
|
||||
@@ -65,7 +65,7 @@ static const struct vs6624_format {
|
||||
static struct v4l2_mbus_framefmt vs6624_default_fmt = {
|
||||
.width = VGA_WIDTH,
|
||||
.height = VGA_HEIGHT,
|
||||
.code = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.code = MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.colorspace = V4L2_COLORSPACE_JPEG,
|
||||
};
|
||||
@@ -558,7 +558,7 @@ static int vs6624_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
}
|
||||
|
||||
static int vs6624_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
|
||||
enum v4l2_mbus_pixelcode *code)
|
||||
u32 *code)
|
||||
{
|
||||
if (index >= ARRAY_SIZE(vs6624_formats))
|
||||
return -EINVAL;
|
||||
@@ -605,15 +605,15 @@ static int vs6624_s_mbus_fmt(struct v4l2_subdev *sd,
|
||||
|
||||
/* set image format */
|
||||
switch (fmt->code) {
|
||||
case V4L2_MBUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
vs6624_write(sd, VS6624_IMG_FMT0, 0x0);
|
||||
vs6624_write(sd, VS6624_YUV_SETUP, 0x1);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
vs6624_write(sd, VS6624_IMG_FMT0, 0x0);
|
||||
vs6624_write(sd, VS6624_YUV_SETUP, 0x3);
|
||||
break;
|
||||
case V4L2_MBUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
vs6624_write(sd, VS6624_IMG_FMT0, 0x4);
|
||||
vs6624_write(sd, VS6624_RGB_SETUP, 0x0);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user