forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/media/i2c/gc4c33.c
....@@ -107,14 +107,6 @@
107107
108108 #define GC4C33_NUM_SUPPLIES ARRAY_SIZE(gc4c33_supply_names)
109109
110
-enum gc4c33_max_pad {
111
- PAD0, /* link to isp */
112
- PAD1, /* link to csi wr0 | hdr x2:L x3:M */
113
- PAD2, /* link to csi wr1 | hdr x3:L */
114
- PAD3, /* link to csi wr2 | hdr x2:M x3:S */
115
- PAD_MAX,
116
-};
117
-
118110 struct regval {
119111 u16 addr;
120112 u8 val;
....@@ -1322,11 +1314,6 @@
13221314 fmt->format.height = mode->height;
13231315 fmt->format.code = mode->bus_fmt;
13241316 fmt->format.field = V4L2_FIELD_NONE;
1325
- /* format info: width/height/data type/virctual channel */
1326
- if (fmt->pad < PAD_MAX && mode->hdr_mode != NO_HDR)
1327
- fmt->reserved[0] = mode->vc[fmt->pad];
1328
- else
1329
- fmt->reserved[0] = mode->vc[PAD0];
13301317 }
13311318 mutex_unlock(&gc4c33->mutex);
13321319
....@@ -1523,14 +1510,12 @@
15231510 struct gc4c33 *gc4c33 = to_gc4c33(sd);
15241511 const struct gc4c33_mode *mode = gc4c33->cur_mode;
15251512
1526
- mutex_lock(&gc4c33->mutex);
15271513 fi->interval = mode->max_fps;
1528
- mutex_unlock(&gc4c33->mutex);
15291514
15301515 return 0;
15311516 }
15321517
1533
-static int gc4c33_g_mbus_config(struct v4l2_subdev *sd,
1518
+static int gc4c33_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
15341519 struct v4l2_mbus_config *config)
15351520 {
15361521 struct gc4c33 *gc4c33 = to_gc4c33(sd);
....@@ -1544,7 +1529,7 @@
15441529 if (mode->hdr_mode == HDR_X3)
15451530 val |= V4L2_MBUS_CSI2_CHANNEL_2;
15461531
1547
- config->type = V4L2_MBUS_CSI2;
1532
+ config->type = V4L2_MBUS_CSI2_DPHY;
15481533 config->flags = val;
15491534
15501535 return 0;
....@@ -1560,6 +1545,17 @@
15601545 strlcpy(inf->base.lens, gc4c33->len_name, sizeof(inf->base.lens));
15611546 }
15621547
1548
+static int gc4c33_get_channel_info(struct gc4c33 *gc4c33, struct rkmodule_channel_info *ch_info)
1549
+{
1550
+ if (ch_info->index < PAD0 || ch_info->index >= PAD_MAX)
1551
+ return -EINVAL;
1552
+ ch_info->vc = gc4c33->cur_mode->vc[ch_info->index];
1553
+ ch_info->width = gc4c33->cur_mode->width;
1554
+ ch_info->height = gc4c33->cur_mode->height;
1555
+ ch_info->bus_fmt = gc4c33->cur_mode->bus_fmt;
1556
+ return 0;
1557
+}
1558
+
15631559 static long gc4c33_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
15641560 {
15651561 struct gc4c33 *gc4c33 = to_gc4c33(sd);
....@@ -1568,6 +1564,7 @@
15681564 u32 i, h, w;
15691565 long ret = 0;
15701566 u32 stream = 0;
1567
+ struct rkmodule_channel_info *ch_info;
15711568
15721569 switch (cmd) {
15731570 case RKMODULE_GET_MODULE_INFO:
....@@ -1629,6 +1626,10 @@
16291626 ret = gc4c33_write_reg(gc4c33->client, GC4C33_REG_CTRL_MODE,
16301627 GC4C33_REG_VALUE_08BIT, GC4C33_MODE_SW_STANDBY);
16311628 break;
1629
+ case RKMODULE_GET_CHANNEL_INFO:
1630
+ ch_info = (struct rkmodule_channel_info *)arg;
1631
+ ret = gc4c33_get_channel_info(gc4c33, ch_info);
1632
+ break;
16321633 default:
16331634 ret = -ENOIOCTLCMD;
16341635 break;
....@@ -1650,6 +1651,7 @@
16501651 struct rkmodule_nr_switch_threshold *nr_switch;
16511652 long ret;
16521653 u32 stream = 0;
1654
+ struct rkmodule_channel_info *ch_info;
16531655
16541656 switch (cmd) {
16551657 case RKMODULE_GET_MODULE_INFO:
....@@ -1660,8 +1662,11 @@
16601662 }
16611663
16621664 ret = gc4c33_ioctl(sd, cmd, inf);
1663
- if (!ret)
1665
+ if (!ret) {
16641666 ret = copy_to_user(up, inf, sizeof(*inf));
1667
+ if (ret)
1668
+ ret = -EFAULT;
1669
+ }
16651670 kfree(inf);
16661671 break;
16671672 case RKMODULE_AWB_CFG:
....@@ -1674,6 +1679,8 @@
16741679 ret = copy_from_user(cfg, up, sizeof(*cfg));
16751680 if (!ret)
16761681 ret = gc4c33_ioctl(sd, cmd, cfg);
1682
+ else
1683
+ ret = -EFAULT;
16771684 kfree(cfg);
16781685 break;
16791686 case RKMODULE_GET_HDR_CFG:
....@@ -1684,8 +1691,11 @@
16841691 }
16851692
16861693 ret = gc4c33_ioctl(sd, cmd, hdr);
1687
- if (!ret)
1694
+ if (!ret) {
16881695 ret = copy_to_user(up, hdr, sizeof(*hdr));
1696
+ if (ret)
1697
+ ret = -EFAULT;
1698
+ }
16891699 kfree(hdr);
16901700 break;
16911701 case RKMODULE_SET_HDR_CFG:
....@@ -1698,6 +1708,8 @@
16981708 ret = copy_from_user(hdr, up, sizeof(*hdr));
16991709 if (!ret)
17001710 ret = gc4c33_ioctl(sd, cmd, hdr);
1711
+ else
1712
+ ret = -EFAULT;
17011713 kfree(hdr);
17021714 break;
17031715 case RKMODULE_SET_DPCC_CFG:
....@@ -1710,6 +1722,8 @@
17101722 ret = copy_from_user(dpcc, up, sizeof(*dpcc));
17111723 if (!ret)
17121724 ret = gc4c33_ioctl(sd, cmd, dpcc);
1725
+ else
1726
+ ret = -EFAULT;
17131727 kfree(dpcc);
17141728 break;
17151729 case PREISP_CMD_SET_HDRAE_EXP:
....@@ -1722,6 +1736,8 @@
17221736 ret = copy_from_user(hdrae, up, sizeof(*hdrae));
17231737 if (!ret)
17241738 ret = gc4c33_ioctl(sd, cmd, hdrae);
1739
+ else
1740
+ ret = -EFAULT;
17251741 kfree(hdrae);
17261742 break;
17271743 case RKMODULE_GET_NR_SWITCH_THRESHOLD:
....@@ -1732,14 +1748,34 @@
17321748 }
17331749
17341750 ret = gc4c33_ioctl(sd, cmd, nr_switch);
1735
- if (!ret)
1751
+ if (!ret) {
17361752 ret = copy_to_user(up, nr_switch, sizeof(*nr_switch));
1753
+ if (ret)
1754
+ ret = -EFAULT;
1755
+ }
17371756 kfree(nr_switch);
17381757 break;
17391758 case RKMODULE_SET_QUICK_STREAM:
17401759 ret = copy_from_user(&stream, up, sizeof(u32));
17411760 if (!ret)
17421761 ret = gc4c33_ioctl(sd, cmd, &stream);
1762
+ else
1763
+ ret = -EFAULT;
1764
+ break;
1765
+ case RKMODULE_GET_CHANNEL_INFO:
1766
+ ch_info = kzalloc(sizeof(*ch_info), GFP_KERNEL);
1767
+ if (!ch_info) {
1768
+ ret = -ENOMEM;
1769
+ return ret;
1770
+ }
1771
+
1772
+ ret = gc4c33_ioctl(sd, cmd, ch_info);
1773
+ if (!ret) {
1774
+ ret = copy_to_user(up, ch_info, sizeof(*ch_info));
1775
+ if (ret)
1776
+ ret = -EFAULT;
1777
+ }
1778
+ kfree(ch_info);
17431779 break;
17441780 default:
17451781 ret = -ENOIOCTLCMD;
....@@ -2046,7 +2082,7 @@
20462082 gpiod_set_value_cansleep(gc4c33->pwren_gpio, 0);
20472083 }
20482084
2049
-static int gc4c33_runtime_resume(struct device *dev)
2085
+static int __maybe_unused gc4c33_runtime_resume(struct device *dev)
20502086 {
20512087 struct i2c_client *client = to_i2c_client(dev);
20522088 struct v4l2_subdev *sd = i2c_get_clientdata(client);
....@@ -2055,7 +2091,7 @@
20552091 return __gc4c33_power_on(gc4c33);
20562092 }
20572093
2058
-static int gc4c33_runtime_suspend(struct device *dev)
2094
+static int __maybe_unused gc4c33_runtime_suspend(struct device *dev)
20592095 {
20602096 struct i2c_client *client = to_i2c_client(dev);
20612097 struct v4l2_subdev *sd = i2c_get_clientdata(client);
....@@ -2127,7 +2163,6 @@
21272163 static const struct v4l2_subdev_video_ops gc4c33_video_ops = {
21282164 .s_stream = gc4c33_s_stream,
21292165 .g_frame_interval = gc4c33_g_frame_interval,
2130
- .g_mbus_config = gc4c33_g_mbus_config,
21312166 };
21322167
21332168 static const struct v4l2_subdev_pad_ops gc4c33_pad_ops = {
....@@ -2136,6 +2171,7 @@
21362171 .enum_frame_interval = gc4c33_enum_frame_interval,
21372172 .get_fmt = gc4c33_get_fmt,
21382173 .set_fmt = gc4c33_set_fmt,
2174
+ .get_mbus_config = gc4c33_g_mbus_config,
21392175 };
21402176
21412177 static const struct v4l2_subdev_ops gc4c33_subdev_ops = {