hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/i2c/rk628/rk628_bt1120_v4l2.c
....@@ -491,6 +491,7 @@
491491 mutex_lock(&bt1120->confctl_mutex);
492492 bt1120->avi_rcv_rdy = false;
493493 plugin = tx_5v_power_present(sd);
494
+ v4l2_ctrl_s_ctrl(bt1120->detect_tx_5v_ctrl, plugin);
494495 v4l2_dbg(1, debug, sd, "%s: 5v_det:%d\n", __func__, plugin);
495496 if (plugin) {
496497 rk628_set_io_func_to_vop(bt1120->rk628);
....@@ -1250,21 +1251,6 @@
12501251 return 0;
12511252 }
12521253
1253
-static int rk628_bt1120_get_ctrl(struct v4l2_ctrl *ctrl)
1254
-{
1255
- int ret = -1;
1256
- struct rk628_bt1120 *bt1120 = container_of(ctrl->handler, struct rk628_bt1120,
1257
- hdl);
1258
- struct v4l2_subdev *sd = &(bt1120->sd);
1259
-
1260
- if (ctrl->id == V4L2_CID_DV_RX_POWER_PRESENT) {
1261
- ret = tx_5v_power_present(sd);
1262
- *ctrl->p_new.p_s32 = ret;
1263
- }
1264
-
1265
- return ret;
1266
-}
1267
-
12681254 static int rk628_bt1120_enum_frame_sizes(struct v4l2_subdev *sd,
12691255 struct v4l2_subdev_pad_config *cfg,
12701256 struct v4l2_subdev_frame_size_enum *fse)
....@@ -1542,6 +1528,9 @@
15421528 case RKMODULE_GET_MODULE_INFO:
15431529 rk628_bt1120_get_module_inf(bt1120, (struct rkmodule_inf *)arg);
15441530 break;
1531
+ case RKMODULE_GET_HDMI_MODE:
1532
+ *(int *)arg = RKMODULE_HDMIIN_MODE;
1533
+ break;
15451534 default:
15461535 ret = -ENOIOCTLCMD;
15471536 break;
....@@ -1557,6 +1546,7 @@
15571546 void __user *up = compat_ptr(arg);
15581547 struct rkmodule_inf *inf;
15591548 long ret;
1549
+ int *seq;
15601550
15611551 switch (cmd) {
15621552 case RKMODULE_GET_MODULE_INFO:
....@@ -1574,7 +1564,21 @@
15741564 }
15751565 kfree(inf);
15761566 break;
1567
+ case RKMODULE_GET_HDMI_MODE:
1568
+ seq = kzalloc(sizeof(*seq), GFP_KERNEL);
1569
+ if (!seq) {
1570
+ ret = -ENOMEM;
1571
+ return ret;
1572
+ }
15771573
1574
+ ret = rk628_bt1120_ioctl(sd, cmd, seq);
1575
+ if (!ret) {
1576
+ ret = copy_to_user(up, seq, sizeof(*seq));
1577
+ if (ret)
1578
+ ret = -EFAULT;
1579
+ }
1580
+ kfree(seq);
1581
+ break;
15781582 default:
15791583 ret = -ENOIOCTLCMD;
15801584 break;
....@@ -1611,10 +1615,6 @@
16111615 .open = bt1120_open,
16121616 };
16131617 #endif
1614
-
1615
-static const struct v4l2_ctrl_ops rk628_bt1120_ctrl_ops = {
1616
- .g_volatile_ctrl = rk628_bt1120_get_ctrl,
1617
-};
16181618
16191619 static const struct v4l2_subdev_core_ops rk628_bt1120_core_ops = {
16201620 .interrupt_service_routine = rk628_bt1120_isr,
....@@ -1712,21 +1712,21 @@
17121712 if (IS_ERR(bt1120->enable_gpio)) {
17131713 ret = PTR_ERR(bt1120->enable_gpio);
17141714 dev_err(dev, "failed to request enable GPIO: %d\n", ret);
1715
- return ret;
1715
+ goto clk_put;
17161716 }
17171717
17181718 bt1120->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
17191719 if (IS_ERR(bt1120->reset_gpio)) {
17201720 ret = PTR_ERR(bt1120->reset_gpio);
17211721 dev_err(dev, "failed to request reset GPIO: %d\n", ret);
1722
- return ret;
1722
+ goto clk_put;
17231723 }
17241724
17251725 bt1120->power_gpio = devm_gpiod_get_optional(dev, "power", GPIOD_OUT_HIGH);
17261726 if (IS_ERR(bt1120->power_gpio)) {
17271727 dev_err(dev, "failed to get power gpio\n");
17281728 ret = PTR_ERR(bt1120->power_gpio);
1729
- return ret;
1729
+ goto clk_put;
17301730 }
17311731
17321732 bt1120->plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det",
....@@ -1734,7 +1734,7 @@
17341734 if (IS_ERR(bt1120->plugin_det_gpio)) {
17351735 dev_err(dev, "failed to get hdmirx det gpio\n");
17361736 ret = PTR_ERR(bt1120->plugin_det_gpio);
1737
- return ret;
1737
+ goto clk_put;
17381738 }
17391739
17401740 if (bt1120->enable_gpio) {
....@@ -1768,14 +1768,15 @@
17681768 ep = of_graph_get_next_endpoint(dev->of_node, NULL);
17691769 if (!ep) {
17701770 dev_err(dev, "missing endpoint node\n");
1771
- return -EINVAL;
1771
+ ret = -EINVAL;
1772
+ goto clk_put;
17721773 }
17731774
17741775 ret = v4l2_fwnode_endpoint_alloc_parse(of_fwnode_handle(ep), &endpoint);
1776
+ of_node_put(ep);
17751777 if (ret) {
17761778 dev_err(dev, "failed to parse endpoint\n");
1777
- of_node_put(ep);
1778
- return ret;
1779
+ goto clk_put;
17791780 }
17801781
17811782 bt1120->enable_hdcp = hdcp1x_enable;
....@@ -1791,6 +1792,9 @@
17911792 ret = 0;
17921793
17931794 v4l2_fwnode_endpoint_free(&endpoint);
1795
+
1796
+clk_put:
1797
+ clk_disable_unprepare(bt1120->soc_24M);
17941798
17951799 return ret;
17961800 }
....@@ -1872,10 +1876,8 @@
18721876 V4L2_CID_PIXEL_RATE, 0, RK628_CSI_PIXEL_RATE_HIGH, 1,
18731877 RK628_CSI_PIXEL_RATE_HIGH);
18741878 bt1120->detect_tx_5v_ctrl = v4l2_ctrl_new_std(&bt1120->hdl,
1875
- &rk628_bt1120_ctrl_ops, V4L2_CID_DV_RX_POWER_PRESENT,
1879
+ NULL, V4L2_CID_DV_RX_POWER_PRESENT,
18761880 0, 1, 0, 0);
1877
- if (bt1120->detect_tx_5v_ctrl)
1878
- bt1120->detect_tx_5v_ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
18791881
18801882 /* custom controls */
18811883 bt1120->audio_sampling_rate_ctrl = v4l2_ctrl_new_custom(&bt1120->hdl,