Merge tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - new Atmel microship ISC driver - coda has gained support for mpeg2 and mpeg4 - cxusb gained support for analog TV - rockchip staging driver was split into two separate staging drivers - added a new staging driver for Allegro DVT video IP core - added a new staging driver for Amlogic Meson video decoder - lots of improvements and cleanups * tag 'media/v5.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (398 commits) media: allegro: use new v4l2_m2m_ioctl_try_encoder_cmd funcs media: doc-rst: Fix typos media: radio-raremono: change devm_k*alloc to k*alloc media: stv0297: fix frequency range limit media: rc: Prefer KEY_NUMERIC_* for number buttons on remotes media: dvb_frontend: split dvb_frontend_handle_ioctl function media: mceusb: disable "nonsensical irdata" messages media: rc: remove redundant dev_err message media: cec-notifier: add new notifier functions media: cec: add struct cec_connector_info support media: cec-notifier: rename variables, check kstrdup and n->conn_name media: MAINTAINERS: Add maintainers for Media Controller media: staging: media: tegra-vde: Defer dmabuf's unmapping media: staging: media: tegra-vde: Add IOMMU support media: hdpvr: fix locking and a missing msleep media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom() media: atmel: atmel-isc: fix i386 build error media: v4l2-ctrl: Move compound control initialization media: hantro: Use vb2_get_buffer media: pci: cx88: Change the type of 'missed' to u64 ...
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
if VIDEO_V4L2
|
||||
|
||||
config VIDEO_IR_I2C
|
||||
tristate "I2C module for IR" if !MEDIA_SUBDRV_AUTOSELECT
|
||||
tristate "I2C module for IR" if !MEDIA_SUBDRV_AUTOSELECT || EXPERT
|
||||
depends on I2C && RC_CORE
|
||||
default y
|
||||
help
|
||||
@@ -23,7 +23,7 @@ config VIDEO_IR_I2C
|
||||
#
|
||||
|
||||
menu "I2C Encoders, decoders, sensors and other helper chips"
|
||||
visible if !MEDIA_SUBDRV_AUTOSELECT || COMPILE_TEST
|
||||
visible if !MEDIA_SUBDRV_AUTOSELECT || COMPILE_TEST || EXPERT
|
||||
|
||||
comment "Audio decoders, processors and mixers"
|
||||
|
||||
@@ -511,6 +511,7 @@ config VIDEO_ADV7393
|
||||
config VIDEO_ADV7511
|
||||
tristate "Analog Devices ADV7511 encoder"
|
||||
depends on VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on DRM_I2C_ADV7511=n || COMPILE_TEST
|
||||
select HDMI
|
||||
help
|
||||
Support for the Analog Devices ADV7511 video encoder.
|
||||
|
@@ -35,7 +35,7 @@ obj-$(CONFIG_VIDEO_ADV748X) += adv748x/
|
||||
obj-$(CONFIG_VIDEO_ADV7604) += adv7604.o
|
||||
obj-$(CONFIG_VIDEO_ADV7842) += adv7842.o
|
||||
obj-$(CONFIG_VIDEO_AD9389B) += ad9389b.o
|
||||
obj-$(CONFIG_VIDEO_ADV7511) += adv7511.o
|
||||
obj-$(CONFIG_VIDEO_ADV7511) += adv7511-v4l2.o
|
||||
obj-$(CONFIG_VIDEO_VPX3220) += vpx3220.o
|
||||
obj-$(CONFIG_VIDEO_VS6624) += vs6624.o
|
||||
obj-$(CONFIG_VIDEO_BT819) += bt819.o
|
||||
|
@@ -5,6 +5,11 @@
|
||||
* Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is named adv7511-v4l2.c so it doesn't conflict with the Analog
|
||||
* Device ADV7511 (config fragment CONFIG_DRM_I2C_ADV7511).
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
@@ -229,7 +229,7 @@ static const struct v4l2_subdev_ops ak881x_subdev_ops = {
|
||||
static int ak881x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
{
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
struct ak881x *ak881x;
|
||||
u8 ifmode, data;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,6 @@
|
||||
#ifndef _CX25840_CORE_H_
|
||||
#define _CX25840_CORE_H_
|
||||
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
@@ -44,10 +43,15 @@ enum cx25840_media_pads {
|
||||
* @mute: audio mute V4L2 control (non-cx2583x devices only)
|
||||
* @pvr150_workaround: whether we enable workaround for Hauppauge PVR150
|
||||
* hardware bug (audio dropping out)
|
||||
* @generic_mode: whether we disable ivtv-specific hacks
|
||||
* this mode gets turned on when the bridge driver calls
|
||||
* cx25840 subdevice init core op
|
||||
* @radio: set if we are currently in the radio mode, otherwise
|
||||
* the current mode is non-radio (that is, video)
|
||||
* @std: currently set video standard
|
||||
* @vid_input: currently set video input
|
||||
* @vid_config: currently set video output configuration
|
||||
* only used in the generic mode
|
||||
* @aud_input: currently set audio input
|
||||
* @audclk_freq: currently set audio sample rate
|
||||
* @audmode: currently set audio mode (when in non-radio mode)
|
||||
@@ -74,9 +78,11 @@ struct cx25840_state {
|
||||
struct v4l2_ctrl *mute;
|
||||
};
|
||||
int pvr150_workaround;
|
||||
bool generic_mode;
|
||||
int radio;
|
||||
v4l2_std_id std;
|
||||
enum cx25840_video_input vid_input;
|
||||
u32 vid_config;
|
||||
enum cx25840_audio_input aud_input;
|
||||
u32 audclk_freq;
|
||||
int audmode;
|
||||
@@ -84,7 +90,7 @@ struct cx25840_state {
|
||||
enum cx25840_model id;
|
||||
u32 rev;
|
||||
int is_initialized;
|
||||
unsigned vbi_regs_offset;
|
||||
unsigned int vbi_regs_offset;
|
||||
wait_queue_head_t fw_wait;
|
||||
struct work_struct fw_work;
|
||||
struct cx25840_ir_state *ir_state;
|
||||
@@ -109,6 +115,14 @@ static inline bool is_cx2583x(struct cx25840_state *state)
|
||||
state->id == CX25837;
|
||||
}
|
||||
|
||||
static inline bool is_cx2584x(struct cx25840_state *state)
|
||||
{
|
||||
return state->id == CX25840 ||
|
||||
state->id == CX25841 ||
|
||||
state->id == CX25842 ||
|
||||
state->id == CX25843;
|
||||
}
|
||||
|
||||
static inline bool is_cx231xx(struct cx25840_state *state)
|
||||
{
|
||||
return state->id == CX2310X_AV;
|
||||
@@ -142,7 +156,8 @@ int cx25840_write(struct i2c_client *client, u16 addr, u8 value);
|
||||
int cx25840_write4(struct i2c_client *client, u16 addr, u32 value);
|
||||
u8 cx25840_read(struct i2c_client *client, u16 addr);
|
||||
u32 cx25840_read4(struct i2c_client *client, u16 addr);
|
||||
int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned mask, u8 value);
|
||||
int cx25840_and_or(struct i2c_client *client, u16 addr, unsigned int mask,
|
||||
u8 value);
|
||||
int cx25840_and_or4(struct i2c_client *client, u16 addr, u32 and_mask,
|
||||
u32 or_value);
|
||||
void cx25840_std_setup(struct i2c_client *client);
|
||||
@@ -161,9 +176,12 @@ extern const struct v4l2_ctrl_ops cx25840_audio_ctrl_ops;
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* cx25850-vbi.c */
|
||||
int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
|
||||
int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
|
||||
int cx25840_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
|
||||
int cx25840_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi);
|
||||
int cx25840_s_sliced_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_sliced_vbi_format *fmt);
|
||||
int cx25840_g_sliced_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_sliced_vbi_format *fmt);
|
||||
int cx25840_decode_vbi_line(struct v4l2_subdev *sd,
|
||||
struct v4l2_decode_vbi_line *vbi);
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/* cx25850-ir.c */
|
||||
|
@@ -86,6 +86,7 @@ int cx25840_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *
|
||||
memset(svbi->service_lines, 0, sizeof(svbi->service_lines));
|
||||
svbi->service_set = 0;
|
||||
/* we're done if raw VBI is active */
|
||||
/* TODO: this will have to be changed for generic_mode VBI */
|
||||
if ((cx25840_read(client, 0x404) & 0x10) == 0)
|
||||
return 0;
|
||||
|
||||
@@ -128,6 +129,7 @@ int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt)
|
||||
cx25840_write(client, 0x54f, vbi_offset);
|
||||
else
|
||||
cx25840_write(client, 0x47f, vbi_offset);
|
||||
/* TODO: this will have to be changed for generic_mode VBI */
|
||||
cx25840_write(client, 0x404, 0x2e);
|
||||
return 0;
|
||||
}
|
||||
@@ -148,6 +150,7 @@ int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *
|
||||
cx25840_std_setup(client);
|
||||
|
||||
/* Sliced VBI */
|
||||
/* TODO: this will have to be changed for generic_mode VBI */
|
||||
cx25840_write(client, 0x404, 0x32); /* Ancillary data */
|
||||
cx25840_write(client, 0x406, 0x13);
|
||||
if (is_cx23888(state))
|
||||
@@ -202,6 +205,7 @@ int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *
|
||||
}
|
||||
|
||||
cx25840_write(client, state->vbi_regs_offset + 0x43c, 0x16);
|
||||
/* TODO: this will have to be changed for generic_mode VBI */
|
||||
if (is_cx23888(state))
|
||||
cx25840_write(client, 0x428, is_pal ? 0x2a : 0x22);
|
||||
else
|
||||
|
@@ -1111,6 +1111,6 @@ static struct i2c_driver imx214_i2c_driver = {
|
||||
|
||||
module_i2c_driver(imx214_i2c_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Sony IMX214 Camera drier");
|
||||
MODULE_DESCRIPTION("Sony IMX214 Camera driver");
|
||||
MODULE_AUTHOR("Ricardo Ribalda <ricardo.ribalda@gmail.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@@ -730,7 +730,7 @@ static int mt9m001_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
{
|
||||
struct mt9m001 *mt9m001;
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
int ret;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/v4l2-mediabus.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/property.h>
|
||||
@@ -240,6 +241,7 @@ struct mt9m111 {
|
||||
int power_count;
|
||||
const struct mt9m111_datafmt *fmt;
|
||||
int lastpage; /* PageMap cache value */
|
||||
struct regulator *regulator;
|
||||
bool is_streaming;
|
||||
/* user point of view - 0: falling 1: rising edge */
|
||||
unsigned int pclk_sample:1;
|
||||
@@ -979,11 +981,23 @@ static int mt9m111_power_on(struct mt9m111 *mt9m111)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = regulator_enable(mt9m111->regulator);
|
||||
if (ret < 0)
|
||||
goto out_clk_disable;
|
||||
|
||||
ret = mt9m111_resume(mt9m111);
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "Failed to resume the sensor: %d\n", ret);
|
||||
v4l2_clk_disable(mt9m111->clk);
|
||||
}
|
||||
if (ret < 0)
|
||||
goto out_regulator_disable;
|
||||
|
||||
return 0;
|
||||
|
||||
out_regulator_disable:
|
||||
regulator_disable(mt9m111->regulator);
|
||||
|
||||
out_clk_disable:
|
||||
v4l2_clk_disable(mt9m111->clk);
|
||||
|
||||
dev_err(&client->dev, "Failed to resume the sensor: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -991,6 +1005,7 @@ static int mt9m111_power_on(struct mt9m111 *mt9m111)
|
||||
static void mt9m111_power_off(struct mt9m111 *mt9m111)
|
||||
{
|
||||
mt9m111_suspend(mt9m111);
|
||||
regulator_disable(mt9m111->regulator);
|
||||
v4l2_clk_disable(mt9m111->clk);
|
||||
}
|
||||
|
||||
@@ -1232,7 +1247,7 @@ static int mt9m111_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
{
|
||||
struct mt9m111 *mt9m111;
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
int ret;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) {
|
||||
@@ -1245,14 +1260,23 @@ static int mt9m111_probe(struct i2c_client *client,
|
||||
if (!mt9m111)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mt9m111_probe_fw(client, mt9m111);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (dev_fwnode(&client->dev)) {
|
||||
ret = mt9m111_probe_fw(client, mt9m111);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
mt9m111->clk = v4l2_clk_get(&client->dev, "mclk");
|
||||
if (IS_ERR(mt9m111->clk))
|
||||
return PTR_ERR(mt9m111->clk);
|
||||
|
||||
mt9m111->regulator = devm_regulator_get(&client->dev, "vdd");
|
||||
if (IS_ERR(mt9m111->regulator)) {
|
||||
dev_err(&client->dev, "regulator not found: %ld\n",
|
||||
PTR_ERR(mt9m111->regulator));
|
||||
return PTR_ERR(mt9m111->regulator);
|
||||
}
|
||||
|
||||
/* Default HIGHPOWER context */
|
||||
mt9m111->ctx = &context_b;
|
||||
|
||||
|
@@ -1031,7 +1031,7 @@ static int mt9p031_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
{
|
||||
struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client);
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
struct mt9p031 *mt9p031;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
@@ -1224,7 +1224,7 @@ static int ov13858_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
ov13858->exposure->minimum,
|
||||
max, ov13858->exposure->step, max);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* Applying V4L2 control value only happens
|
||||
@@ -1262,7 +1262,7 @@ static int ov13858_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
"ctrl(id:0x%x,val:0x%x) is not handled\n",
|
||||
ctrl->id, ctrl->val);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
pm_runtime_put(&client->dev);
|
||||
|
||||
|
@@ -1194,7 +1194,7 @@ static int ov2640_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *did)
|
||||
{
|
||||
struct ov2640_priv *priv;
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
int ret;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
|
@@ -576,7 +576,7 @@ static int ov2685_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
__func__, ctrl->id, ctrl->val);
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
pm_runtime_put(&client->dev);
|
||||
|
||||
|
@@ -1143,7 +1143,7 @@ static int ov5695_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
|
||||
__func__, ctrl->id, ctrl->val);
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
pm_runtime_put(&client->dev);
|
||||
|
||||
|
@@ -1006,7 +1006,6 @@ static int ov6650_probe(struct i2c_client *client,
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
priv->subdev.internal_ops = &ov6650_internal_ops;
|
||||
priv->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
||||
|
||||
ret = v4l2_async_register_subdev(&priv->subdev);
|
||||
if (ret)
|
||||
|
@@ -532,7 +532,7 @@ static int ov7740_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&ov7740->subdev);
|
||||
struct regmap *regmap = ov7740->regmap;
|
||||
int ret;
|
||||
u8 val = 0;
|
||||
u8 val;
|
||||
|
||||
if (!pm_runtime_get_if_in_use(&client->dev))
|
||||
return 0;
|
||||
@@ -551,6 +551,7 @@ static int ov7740_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
ret = ov7740_set_contrast(regmap, ctrl->val);
|
||||
break;
|
||||
case V4L2_CID_VFLIP:
|
||||
val = ctrl->val ? REG0C_IMG_FLIP : 0x00;
|
||||
ret = regmap_update_bits(regmap, REG_REG0C,
|
||||
REG0C_IMG_FLIP, val);
|
||||
break;
|
||||
@@ -561,16 +562,16 @@ static int ov7740_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
break;
|
||||
case V4L2_CID_AUTOGAIN:
|
||||
if (!ctrl->val)
|
||||
return ov7740_set_gain(regmap, ov7740->gain->val);
|
||||
|
||||
ret = ov7740_set_autogain(regmap, ctrl->val);
|
||||
ret = ov7740_set_gain(regmap, ov7740->gain->val);
|
||||
else
|
||||
ret = ov7740_set_autogain(regmap, ctrl->val);
|
||||
break;
|
||||
|
||||
case V4L2_CID_EXPOSURE_AUTO:
|
||||
if (ctrl->val == V4L2_EXPOSURE_MANUAL)
|
||||
return ov7740_set_exp(regmap, ov7740->exposure->val);
|
||||
|
||||
ret = ov7740_set_autoexp(regmap, ctrl->val);
|
||||
ret = ov7740_set_exp(regmap, ov7740->exposure->val);
|
||||
else
|
||||
ret = ov7740_set_autoexp(regmap, ctrl->val);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -785,7 +786,11 @@ static int ov7740_try_fmt_internal(struct v4l2_subdev *sd,
|
||||
|
||||
fsize++;
|
||||
}
|
||||
|
||||
if (i >= ARRAY_SIZE(ov7740_framesizes)) {
|
||||
fsize = &ov7740_framesizes[0];
|
||||
fmt->width = fsize->width;
|
||||
fmt->height = fsize->height;
|
||||
}
|
||||
if (ret_frmsize != NULL)
|
||||
*ret_frmsize = fsize;
|
||||
|
||||
@@ -1007,8 +1012,6 @@ static int ov7740_init_controls(struct ov7740 *ov7740)
|
||||
|
||||
ov7740->gain = v4l2_ctrl_new_std(ctrl_hdlr, &ov7740_ctrl_ops,
|
||||
V4L2_CID_GAIN, 0, 1023, 1, 500);
|
||||
if (ov7740->gain)
|
||||
ov7740->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
|
||||
ov7740->auto_gain = v4l2_ctrl_new_std(ctrl_hdlr, &ov7740_ctrl_ops,
|
||||
V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
|
||||
@@ -1026,7 +1029,6 @@ static int ov7740_init_controls(struct ov7740 *ov7740)
|
||||
v4l2_ctrl_auto_cluster(2, &ov7740->auto_gain, 0, true);
|
||||
v4l2_ctrl_auto_cluster(2, &ov7740->auto_exposure,
|
||||
V4L2_EXPOSURE_MANUAL, true);
|
||||
v4l2_ctrl_cluster(2, &ov7740->hflip);
|
||||
|
||||
if (ctrl_hdlr->error) {
|
||||
ret = ctrl_hdlr->error;
|
||||
|
@@ -195,11 +195,11 @@ static const struct ov8856_reg mode_3280x2464_regs[] = {
|
||||
{0x3800, 0x00},
|
||||
{0x3801, 0x00},
|
||||
{0x3802, 0x00},
|
||||
{0x3803, 0x07},
|
||||
{0x3803, 0x06},
|
||||
{0x3804, 0x0c},
|
||||
{0x3805, 0xdf},
|
||||
{0x3806, 0x09},
|
||||
{0x3807, 0xa6},
|
||||
{0x3807, 0xa7},
|
||||
{0x3808, 0x0c},
|
||||
{0x3809, 0xd0},
|
||||
{0x380a, 0x09},
|
||||
@@ -211,7 +211,7 @@ static const struct ov8856_reg mode_3280x2464_regs[] = {
|
||||
{0x3810, 0x00},
|
||||
{0x3811, 0x00},
|
||||
{0x3812, 0x00},
|
||||
{0x3813, 0x00},
|
||||
{0x3813, 0x01},
|
||||
{0x3814, 0x01},
|
||||
{0x3815, 0x01},
|
||||
{0x3816, 0x00},
|
||||
@@ -385,11 +385,11 @@ static const struct ov8856_reg mode_1640x1232_regs[] = {
|
||||
{0x3800, 0x00},
|
||||
{0x3801, 0x00},
|
||||
{0x3802, 0x00},
|
||||
{0x3803, 0x07},
|
||||
{0x3803, 0x06},
|
||||
{0x3804, 0x0c},
|
||||
{0x3805, 0xdf},
|
||||
{0x3806, 0x09},
|
||||
{0x3807, 0xa6},
|
||||
{0x3807, 0xa7},
|
||||
{0x3808, 0x06},
|
||||
{0x3809, 0x68},
|
||||
{0x380a, 0x04},
|
||||
@@ -401,7 +401,7 @@ static const struct ov8856_reg mode_1640x1232_regs[] = {
|
||||
{0x3810, 0x00},
|
||||
{0x3811, 0x00},
|
||||
{0x3812, 0x00},
|
||||
{0x3813, 0x00},
|
||||
{0x3813, 0x01},
|
||||
{0x3814, 0x03},
|
||||
{0x3815, 0x01},
|
||||
{0x3816, 0x00},
|
||||
|
@@ -691,14 +691,14 @@ static int ov9640_probe(struct i2c_client *client,
|
||||
|
||||
priv->gpio_power = devm_gpiod_get(&client->dev, "Camera power",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR_OR_NULL(priv->gpio_power)) {
|
||||
if (IS_ERR(priv->gpio_power)) {
|
||||
ret = PTR_ERR(priv->gpio_power);
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->gpio_reset = devm_gpiod_get(&client->dev, "Camera reset",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR_OR_NULL(priv->gpio_reset)) {
|
||||
if (IS_ERR(priv->gpio_reset)) {
|
||||
ret = PTR_ERR(priv->gpio_reset);
|
||||
return ret;
|
||||
}
|
||||
|
@@ -194,7 +194,7 @@ static int jt8ev1_post_streamoff(struct smiapp_sensor *sensor)
|
||||
return rval;
|
||||
|
||||
/* Wait for 1 ms + one line => 2 ms is likely enough */
|
||||
usleep_range(2000, 2000);
|
||||
usleep_range(2000, 2050);
|
||||
|
||||
/* Restore it */
|
||||
rval = smiapp_write_8(sensor, 0x3205, 0x00);
|
||||
|
@@ -61,7 +61,10 @@ static const u32 mipid02_supported_fmt_codes[] = {
|
||||
MEDIA_BUS_FMT_SGRBG10_1X10, MEDIA_BUS_FMT_SRGGB10_1X10,
|
||||
MEDIA_BUS_FMT_SBGGR12_1X12, MEDIA_BUS_FMT_SGBRG12_1X12,
|
||||
MEDIA_BUS_FMT_SGRBG12_1X12, MEDIA_BUS_FMT_SRGGB12_1X12,
|
||||
MEDIA_BUS_FMT_UYVY8_1X16, MEDIA_BUS_FMT_BGR888_1X24
|
||||
MEDIA_BUS_FMT_UYVY8_1X16, MEDIA_BUS_FMT_BGR888_1X24,
|
||||
MEDIA_BUS_FMT_RGB565_2X8_LE, MEDIA_BUS_FMT_RGB565_2X8_BE,
|
||||
MEDIA_BUS_FMT_YUYV8_2X8, MEDIA_BUS_FMT_UYVY8_2X8,
|
||||
MEDIA_BUS_FMT_JPEG_1X8
|
||||
};
|
||||
|
||||
/* regulator supplies */
|
||||
@@ -99,6 +102,7 @@ struct mipid02_dev {
|
||||
u8 data_lane1_reg1;
|
||||
u8 mode_reg1;
|
||||
u8 mode_reg2;
|
||||
u8 data_selection_ctrl;
|
||||
u8 data_id_rreg;
|
||||
u8 pix_width_ctrl;
|
||||
u8 pix_width_ctrl_emb;
|
||||
@@ -128,6 +132,10 @@ static int bpp_from_code(__u32 code)
|
||||
case MEDIA_BUS_FMT_SRGGB12_1X12:
|
||||
return 12;
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
return 16;
|
||||
case MEDIA_BUS_FMT_BGR888_1X24:
|
||||
return 24;
|
||||
@@ -155,9 +163,14 @@ static u8 data_type_from_code(__u32 code)
|
||||
case MEDIA_BUS_FMT_SRGGB12_1X12:
|
||||
return 0x2c;
|
||||
case MEDIA_BUS_FMT_UYVY8_1X16:
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
return 0x1e;
|
||||
case MEDIA_BUS_FMT_BGR888_1X24:
|
||||
return 0x24;
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_LE:
|
||||
case MEDIA_BUS_FMT_RGB565_2X8_BE:
|
||||
return 0x22;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -331,6 +344,25 @@ static int mipid02_detect(struct mipid02_dev *bridge)
|
||||
return mipid02_read_reg(bridge, MIPID02_CLK_LANE_WR_REG1, ®);
|
||||
}
|
||||
|
||||
static u32 mipid02_get_link_freq_from_cid_link_freq(struct mipid02_dev *bridge,
|
||||
struct v4l2_subdev *subdev)
|
||||
{
|
||||
struct v4l2_querymenu qm = {.id = V4L2_CID_LINK_FREQ, };
|
||||
struct v4l2_ctrl *ctrl;
|
||||
int ret;
|
||||
|
||||
ctrl = v4l2_ctrl_find(subdev->ctrl_handler, V4L2_CID_LINK_FREQ);
|
||||
if (!ctrl)
|
||||
return 0;
|
||||
qm.index = v4l2_ctrl_g_ctrl(ctrl);
|
||||
|
||||
ret = v4l2_querymenu(subdev->ctrl_handler, &qm);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
return qm.value;
|
||||
}
|
||||
|
||||
static u32 mipid02_get_link_freq_from_cid_pixel_rate(struct mipid02_dev *bridge,
|
||||
struct v4l2_subdev *subdev)
|
||||
{
|
||||
@@ -358,10 +390,14 @@ static int mipid02_configure_from_rx_speed(struct mipid02_dev *bridge)
|
||||
struct v4l2_subdev *subdev = bridge->s_subdev;
|
||||
u32 link_freq;
|
||||
|
||||
link_freq = mipid02_get_link_freq_from_cid_pixel_rate(bridge, subdev);
|
||||
link_freq = mipid02_get_link_freq_from_cid_link_freq(bridge, subdev);
|
||||
if (!link_freq) {
|
||||
dev_err(&client->dev, "Failed to detect link frequency");
|
||||
return -EINVAL;
|
||||
link_freq = mipid02_get_link_freq_from_cid_pixel_rate(bridge,
|
||||
subdev);
|
||||
if (!link_freq) {
|
||||
dev_err(&client->dev, "Failed to get link frequency");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
dev_dbg(&client->dev, "detect link_freq = %d Hz", link_freq);
|
||||
@@ -452,6 +488,7 @@ static int mipid02_configure_from_tx(struct mipid02_dev *bridge)
|
||||
{
|
||||
struct v4l2_fwnode_endpoint *ep = &bridge->tx;
|
||||
|
||||
bridge->r.data_selection_ctrl = SELECTION_MANUAL_WIDTH;
|
||||
bridge->r.pix_width_ctrl = ep->bus.parallel.bus_width;
|
||||
bridge->r.pix_width_ctrl_emb = ep->bus.parallel.bus_width;
|
||||
if (ep->bus.parallel.flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
|
||||
@@ -467,10 +504,15 @@ static int mipid02_configure_from_code(struct mipid02_dev *bridge)
|
||||
u8 data_type;
|
||||
|
||||
bridge->r.data_id_rreg = 0;
|
||||
data_type = data_type_from_code(bridge->fmt.code);
|
||||
if (!data_type)
|
||||
return -EINVAL;
|
||||
bridge->r.data_id_rreg = data_type;
|
||||
|
||||
if (bridge->fmt.code != MEDIA_BUS_FMT_JPEG_1X8) {
|
||||
bridge->r.data_selection_ctrl |= SELECTION_MANUAL_DATA;
|
||||
|
||||
data_type = data_type_from_code(bridge->fmt.code);
|
||||
if (!data_type)
|
||||
return -EINVAL;
|
||||
bridge->r.data_id_rreg = data_type;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -554,7 +596,7 @@ static int mipid02_stream_enable(struct mipid02_dev *bridge)
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = mipid02_write_reg(bridge, MIPID02_DATA_SELECTION_CTRL,
|
||||
SELECTION_MANUAL_DATA | SELECTION_MANUAL_WIDTH);
|
||||
bridge->r.data_selection_ctrl);
|
||||
if (ret)
|
||||
goto error;
|
||||
ret = mipid02_write_reg(bridge, MIPID02_PIX_WIDTH_CTRL,
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* For the STS-Thompson TDA7432 audio processor chip
|
||||
*
|
||||
@@ -9,7 +10,7 @@
|
||||
*
|
||||
* Copyright (c) 2000 Eric Sandeen <eric_sandeen@bigfoot.com>
|
||||
* Copyright (c) 2006 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
* This code is placed under the terms of the GNU General Public License
|
||||
*
|
||||
* Based on tda9855.c by Steve VanDeBogart (vandebo@uclink.berkeley.edu)
|
||||
* Which was based on tda8425.c by Greg Alexander (c) 1998
|
||||
*
|
||||
|
@@ -934,8 +934,7 @@ static int tw9910_probe(struct i2c_client *client,
|
||||
{
|
||||
struct tw9910_priv *priv;
|
||||
struct tw9910_video_info *info;
|
||||
struct i2c_adapter *adapter =
|
||||
to_i2c_adapter(client->dev.parent);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
int ret;
|
||||
|
||||
if (!client->dev.platform_data) {
|
||||
|
@@ -190,12 +190,8 @@ static int mlx90640_setup(struct video_i2c_data *data)
|
||||
unsigned int n, idx;
|
||||
|
||||
for (n = 0; n < data->chip->num_frame_intervals - 1; n++) {
|
||||
if (data->frame_interval.numerator
|
||||
!= data->chip->frame_intervals[n].numerator)
|
||||
continue;
|
||||
|
||||
if (data->frame_interval.denominator
|
||||
== data->chip->frame_intervals[n].denominator)
|
||||
if (V4L2_FRACT_COMPARE(data->frame_interval, ==,
|
||||
data->chip->frame_intervals[n]))
|
||||
break;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user