From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 03 Jan 2024 09:43:39 +0000
Subject: [PATCH] update kernel to 5.10.198
---
kernel/drivers/media/i2c/lt7911d.c | 131 +++++++++++++++----------------------------
1 files changed, 47 insertions(+), 84 deletions(-)
diff --git a/kernel/drivers/media/i2c/lt7911d.c b/kernel/drivers/media/i2c/lt7911d.c
index 30bf0b2..f8d3c5b 100644
--- a/kernel/drivers/media/i2c/lt7911d.c
+++ b/kernel/drivers/media/i2c/lt7911d.c
@@ -49,6 +49,12 @@
#define LT7911D_LINK_FREQ 400000000
#define LT7911D_PIXEL_RATE 400000000
+#ifdef LT7911D_OUT_RGB
+#define LT7911D_MEDIA_BUS_FMT MEDIA_BUS_FMT_BGR888_1X24
+#else
+#define LT7911D_MEDIA_BUS_FMT MEDIA_BUS_FMT_UYVY8_2X8
+#endif
+
#define LT7911D_NAME "LT7911D"
static const s64 link_freq_menu_items[] = {
@@ -73,7 +79,6 @@
struct clk *xvclk;
struct gpio_desc *reset_gpio;
struct gpio_desc *plugin_det_gpio;
- struct gpio_desc *hpd_ctl_gpio;
struct gpio_desc *power_gpio;
struct work_struct work_i2c_poll;
struct timer_list timer;
@@ -472,22 +477,6 @@
return 0;
}
-static void lt7911d_config_hpd(struct v4l2_subdev *sd)
-{
- struct lt7911d_state *lt7911d = to_state(sd);
- bool plugin;
-
- plugin = tx_5v_power_present(sd);
- v4l2_dbg(2, debug, sd, "%s: plugin: %d\n", __func__, plugin);
-
- if (plugin) {
- gpiod_set_value(lt7911d->hpd_ctl_gpio, 1);
- } else {
- lt7911d->nosignal = true;
- gpiod_set_value(lt7911d->hpd_ctl_gpio, 0);
- }
-}
-
static void lt7911d_delayed_work_enable_hotplug(struct work_struct *work)
{
struct delayed_work *dwork = to_delayed_work(work);
@@ -495,7 +484,7 @@
struct lt7911d_state, delayed_work_enable_hotplug);
struct v4l2_subdev *sd = <7911d->sd;
- lt7911d_config_hpd(sd);
+ v4l2_ctrl_s_ctrl(lt7911d->detect_tx_5v_ctrl, tx_5v_power_present(sd));
}
static void lt7911d_delayed_work_res_change(struct work_struct *work)
@@ -577,21 +566,6 @@
v4l2_subdev_notify_event(sd, <7911d_ev_fmt);
}
-static int lt7911d_get_ctrl(struct v4l2_ctrl *ctrl)
-{
- int ret = -1;
- struct lt7911d_state *lt7911d = container_of(ctrl->handler,
- struct lt7911d_state, hdl);
- struct v4l2_subdev *sd = &(lt7911d->sd);
-
- if (ctrl->id == V4L2_CID_DV_RX_POWER_PRESENT) {
- ret = tx_5v_power_present(sd);
- *ctrl->p_new.p_s32 = ret;
- }
-
- return ret;
-}
-
static int lt7911d_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
{
struct lt7911d_state *lt7911d = to_state(sd);
@@ -615,12 +589,10 @@
static irqreturn_t plugin_detect_irq_handler(int irq, void *dev_id)
{
struct lt7911d_state *lt7911d = dev_id;
- struct v4l2_subdev *sd = <7911d->sd;
/* control hpd output level after 25ms */
schedule_delayed_work(<7911d->delayed_work_enable_hotplug,
HZ / 40);
- tx_5v_power_present(sd);
return IRQ_HANDLED;
}
@@ -748,11 +720,11 @@
}
static int lt7911d_g_mbus_config(struct v4l2_subdev *sd,
- struct v4l2_mbus_config *cfg)
+ unsigned int pad, struct v4l2_mbus_config *cfg)
{
struct lt7911d_state *lt7911d = to_state(sd);
- cfg->type = V4L2_MBUS_CSI2;
+ cfg->type = V4L2_MBUS_CSI2_DPHY;
cfg->flags = V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK |
V4L2_MBUS_CSI2_CHANNEL_0;
@@ -790,7 +762,7 @@
{
switch (code->index) {
case 0:
- code->code = MEDIA_BUS_FMT_UYVY8_2X8;
+ code->code = LT7911D_MEDIA_BUS_FMT;
break;
default:
@@ -807,7 +779,7 @@
if (fse->index >= ARRAY_SIZE(supported_modes))
return -EINVAL;
- if (fse->code != MEDIA_BUS_FMT_UYVY8_2X8)
+ if (fse->code != LT7911D_MEDIA_BUS_FMT)
return -EINVAL;
fse->min_width = supported_modes[fse->index].width;
@@ -848,8 +820,7 @@
if (fie->index >= ARRAY_SIZE(supported_modes))
return -EINVAL;
- if (fie->code != MEDIA_BUS_FMT_UYVY8_2X8)
- return -EINVAL;
+ fie->code = LT7911D_MEDIA_BUS_FMT;
fie->width = supported_modes[fie->index].width;
fie->height = supported_modes[fie->index].height;
@@ -902,7 +873,7 @@
return ret;
switch (code) {
- case MEDIA_BUS_FMT_UYVY8_2X8:
+ case LT7911D_MEDIA_BUS_FMT:
break;
default:
@@ -951,6 +922,9 @@
case RKMODULE_GET_MODULE_INFO:
lt7911d_get_module_inf(lt7911d, (struct rkmodule_inf *)arg);
break;
+ case RKMODULE_GET_HDMI_MODE:
+ *(int *)arg = RKMODULE_HDMIIN_MODE;
+ break;
default:
ret = -ENOIOCTLCMD;
break;
@@ -966,6 +940,7 @@
void __user *up = compat_ptr(arg);
struct rkmodule_inf *inf;
long ret;
+ int *seq;
switch (cmd) {
case RKMODULE_GET_MODULE_INFO:
@@ -983,7 +958,21 @@
}
kfree(inf);
break;
+ case RKMODULE_GET_HDMI_MODE:
+ seq = kzalloc(sizeof(*seq), GFP_KERNEL);
+ if (!seq) {
+ ret = -ENOMEM;
+ return ret;
+ }
+ ret = lt7911d_ioctl(sd, cmd, seq);
+ if (!ret) {
+ ret = copy_to_user(up, seq, sizeof(*seq));
+ if (ret)
+ ret = -EFAULT;
+ }
+ kfree(seq);
+ break;
default:
ret = -ENOIOCTLCMD;
break;
@@ -992,10 +981,6 @@
return ret;
}
#endif
-
-static const struct v4l2_ctrl_ops lt7911d_ctrl_ops = {
- .g_volatile_ctrl = lt7911d_get_ctrl,
-};
static const struct v4l2_subdev_core_ops lt7911d_core_ops = {
.interrupt_service_routine = lt7911d_isr,
@@ -1012,7 +997,6 @@
.s_dv_timings = lt7911d_s_dv_timings,
.g_dv_timings = lt7911d_g_dv_timings,
.query_dv_timings = lt7911d_query_dv_timings,
- .g_mbus_config = lt7911d_g_mbus_config,
.s_stream = lt7911d_s_stream,
.g_frame_interval = lt7911d_g_frame_interval,
};
@@ -1025,6 +1009,7 @@
.get_fmt = lt7911d_get_fmt,
.enum_dv_timings = lt7911d_enum_dv_timings,
.dv_timings_cap = lt7911d_dv_timings_cap,
+ .get_mbus_config = lt7911d_g_mbus_config,
};
static const struct v4l2_subdev_ops lt7911d_ops = {
@@ -1055,16 +1040,6 @@
.flags = V4L2_CTRL_FLAG_READ_ONLY,
};
-static void lt7911d_reset(struct lt7911d_state *lt7911d)
-{
- gpiod_set_value(lt7911d->reset_gpio, 0);
- usleep_range(2000, 2100);
- gpiod_set_value(lt7911d->reset_gpio, 1);
- usleep_range(120*1000, 121*1000);
- gpiod_set_value(lt7911d->reset_gpio, 0);
- usleep_range(300*1000, 310*1000);
-}
-
static int lt7911d_init_v4l2_ctrls(struct lt7911d_state *lt7911d)
{
struct v4l2_subdev *sd;
@@ -1084,10 +1059,8 @@
0, LT7911D_PIXEL_RATE, 1, LT7911D_PIXEL_RATE);
lt7911d->detect_tx_5v_ctrl = v4l2_ctrl_new_std(<7911d->hdl,
- <7911d_ctrl_ops, V4L2_CID_DV_RX_POWER_PRESENT,
+ NULL, V4L2_CID_DV_RX_POWER_PRESENT,
0, 1, 0, 0);
- if (lt7911d->detect_tx_5v_ctrl)
- lt7911d->detect_tx_5v_ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
lt7911d->audio_sampling_rate_ctrl =
v4l2_ctrl_new_custom(<7911d->hdl,
@@ -1119,7 +1092,7 @@
{
struct device *dev = <7911d->i2c_client->dev;
struct device_node *node = dev->of_node;
- struct v4l2_fwnode_endpoint *endpoint;
+ struct v4l2_fwnode_endpoint endpoint = { .bus_type = 0 };
struct device_node *ep;
int ret;
@@ -1160,29 +1133,20 @@
return ret;
}
- lt7911d->hpd_ctl_gpio = devm_gpiod_get_optional(dev, "hpd-ctl",
- GPIOD_OUT_HIGH);
- if (IS_ERR(lt7911d->hpd_ctl_gpio)) {
- dev_err(dev, "failed to get hpd ctl gpio\n");
- ret = PTR_ERR(lt7911d->hpd_ctl_gpio);
- return ret;
- }
-
ep = of_graph_get_next_endpoint(dev->of_node, NULL);
if (!ep) {
dev_err(dev, "missing endpoint node\n");
return -EINVAL;
}
- endpoint = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(ep));
- if (IS_ERR(endpoint)) {
+ ret = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(ep), &endpoint);
+ if (ret) {
dev_err(dev, "failed to parse endpoint\n");
- ret = PTR_ERR(endpoint);
- return ret;
+ goto put_node;
}
- if (endpoint->bus_type != V4L2_MBUS_CSI2 ||
- endpoint->bus.mipi_csi2.num_data_lanes == 0) {
+ if (endpoint.bus_type != V4L2_MBUS_CSI2_DPHY ||
+ endpoint.bus.mipi_csi2.num_data_lanes == 0) {
dev_err(dev, "missing CSI-2 properties in endpoint\n");
ret = -EINVAL;
goto free_endpoint;
@@ -1201,18 +1165,20 @@
goto free_endpoint;
}
- lt7911d->csi_lanes_in_use = endpoint->bus.mipi_csi2.num_data_lanes;
- lt7911d->bus = endpoint->bus.mipi_csi2;
+ lt7911d->csi_lanes_in_use = endpoint.bus.mipi_csi2.num_data_lanes;
+ lt7911d->bus = endpoint.bus.mipi_csi2;
lt7911d->enable_hdcp = false;
- gpiod_set_value(lt7911d->hpd_ctl_gpio, 0);
gpiod_set_value(lt7911d->power_gpio, 1);
- lt7911d_reset(lt7911d);
+ usleep_range(2000, 3000);
+ gpiod_set_value(lt7911d->reset_gpio, 0);
ret = 0;
free_endpoint:
- v4l2_fwnode_endpoint_free(endpoint);
+ v4l2_fwnode_endpoint_free(&endpoint);
+put_node:
+ of_node_put(ep);
return ret;
}
#else
@@ -1266,7 +1232,7 @@
sd = <7911d->sd;
lt7911d->i2c_client = client;
lt7911d->cur_mode = &supported_modes[0];
- lt7911d->mbus_fmt_code = MEDIA_BUS_FMT_UYVY8_2X8;
+ lt7911d->mbus_fmt_code = LT7911D_MEDIA_BUS_FMT;
err = lt7911d_probe_of(lt7911d);
if (err) {
@@ -1277,8 +1243,6 @@
err = lt7911d_check_chip_id(lt7911d);
if (err < 0)
return err;
-
- lt7911d_reset(lt7911d);
mutex_init(<7911d->confctl_mutex);
err = lt7911d_init_v4l2_ctrls(lt7911d);
@@ -1357,7 +1321,6 @@
goto err_work_queues;
}
- lt7911d_config_hpd(sd);
v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
client->addr << 1, client->adapter->name);
--
Gitblit v1.6.2