hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/phy/rockchip/phy-rockchip-mipi-rx.c
....@@ -750,6 +750,9 @@
750750 struct v4l2_querymenu qm = { .id = V4L2_CID_LINK_FREQ, };
751751 int ret;
752752
753
+ if (!sensor_sd)
754
+ return -ENODEV;
755
+
753756 link_freq = v4l2_ctrl_find(sensor_sd->ctrl_handler, V4L2_CID_LINK_FREQ);
754757 if (!link_freq) {
755758 v4l2_warn(sd, "No pixel rate control in subdev\n");
....@@ -777,11 +780,16 @@
777780 {
778781 struct mipidphy_priv *priv = to_dphy_priv(sd);
779782 struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
780
- struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
783
+ struct mipidphy_sensor *sensor;
781784 struct v4l2_mbus_config mbus;
782785 int ret;
783786
784
- ret = v4l2_subdev_call(sensor_sd, video, g_mbus_config, &mbus);
787
+ if (!sensor_sd)
788
+ return -ENODEV;
789
+ sensor = sd_to_sensor(priv, sensor_sd);
790
+ if (!sensor)
791
+ return -ENODEV;
792
+ ret = v4l2_subdev_call(sensor_sd, pad, get_mbus_config, 0, &mbus);
785793 if (ret)
786794 return ret;
787795
....@@ -899,7 +907,7 @@
899907 return -EINVAL;
900908 }
901909
902
-static int mipidphy_g_mbus_config(struct v4l2_subdev *sd,
910
+static int mipidphy_g_mbus_config(struct v4l2_subdev *sd, unsigned int pad_id,
903911 struct v4l2_mbus_config *config)
904912 {
905913 struct mipidphy_priv *priv = to_dphy_priv(sd);
....@@ -909,6 +917,8 @@
909917 if (!sensor_sd)
910918 return -ENODEV;
911919 sensor = sd_to_sensor(priv, sensor_sd);
920
+ if (!sensor)
921
+ return -ENODEV;
912922 mipidphy_update_sensor_mbus(sd);
913923 *config = sensor->mbus;
914924
....@@ -925,7 +935,7 @@
925935 return pm_runtime_put(priv->dev);
926936 }
927937
928
-static int mipidphy_runtime_suspend(struct device *dev)
938
+static int __maybe_unused mipidphy_runtime_suspend(struct device *dev)
929939 {
930940 struct media_entity *me = dev_get_drvdata(dev);
931941 struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(me);
....@@ -940,7 +950,7 @@
940950 return 0;
941951 }
942952
943
-static int mipidphy_runtime_resume(struct device *dev)
953
+static int __maybe_unused mipidphy_runtime_resume(struct device *dev)
944954 {
945955 struct media_entity *me = dev_get_drvdata(dev);
946956 struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(me);
....@@ -970,13 +980,16 @@
970980 {
971981 struct mipidphy_priv *priv = to_dphy_priv(sd);
972982 struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
973
- struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
983
+ struct mipidphy_sensor *sensor;
974984 int ret;
975985 /*
976986 * Do not allow format changes and just relay whatever
977987 * set currently in the sensor.
978988 */
979989 if (!sensor_sd)
990
+ return -ENODEV;
991
+ sensor = sd_to_sensor(priv, sensor_sd);
992
+ if (!sensor)
980993 return -ENODEV;
981994 ret = v4l2_subdev_call(sensor_sd, pad, get_fmt, NULL, fmt);
982995 if (!ret && fmt->pad == 0)
....@@ -997,6 +1010,7 @@
9971010 .set_fmt = mipidphy_get_set_fmt,
9981011 .get_fmt = mipidphy_get_set_fmt,
9991012 .get_selection = mipidphy_get_selection,
1013
+ .get_mbus_config = mipidphy_g_mbus_config,
10001014 };
10011015
10021016 static const struct v4l2_subdev_core_ops mipidphy_core_ops = {
....@@ -1005,7 +1019,6 @@
10051019
10061020 static const struct v4l2_subdev_video_ops mipidphy_video_ops = {
10071021 .g_frame_interval = mipidphy_g_frame_interval,
1008
- .g_mbus_config = mipidphy_g_mbus_config,
10091022 .s_stream = mipidphy_s_stream,
10101023 };
10111024
....@@ -1146,11 +1159,17 @@
11461159 struct v4l2_subdev *sd)
11471160 {
11481161 struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
1149
- struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
1162
+ struct mipidphy_sensor *sensor;
11501163 const struct dphy_drv_data *drv_data = priv->drv_data;
11511164 const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
11521165 int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
11531166 int i, hsfreq = 0;
1167
+
1168
+ if (!sensor_sd)
1169
+ return -ENODEV;
1170
+ sensor = sd_to_sensor(priv, sensor_sd);
1171
+ if (!sensor)
1172
+ return -ENODEV;
11541173
11551174 for (i = 0; i < num_hsfreq_ranges; i++) {
11561175 if (hsfreq_ranges[i].range_h >= priv->data_rate_mbps) {
....@@ -1237,11 +1256,17 @@
12371256 struct v4l2_subdev *sd)
12381257 {
12391258 struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
1240
- struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
1259
+ struct mipidphy_sensor *sensor;
12411260 const struct dphy_drv_data *drv_data = priv->drv_data;
12421261 const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
12431262 int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
12441263 int i, hsfreq = 0;
1264
+
1265
+ if (!sensor_sd)
1266
+ return -ENODEV;
1267
+ sensor = sd_to_sensor(priv, sensor_sd);
1268
+ if (!sensor)
1269
+ return -ENODEV;
12451270
12461271 for (i = 0; i < num_hsfreq_ranges; i++) {
12471272 if (hsfreq_ranges[i].range_h >= priv->data_rate_mbps) {
....@@ -1356,13 +1381,19 @@
13561381 struct v4l2_subdev *sd)
13571382 {
13581383 struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
1359
- struct mipidphy_sensor *sensor = sd_to_sensor(priv, sensor_sd);
1384
+ struct mipidphy_sensor *sensor;
13601385 const struct dphy_drv_data *drv_data = priv->drv_data;
13611386 const struct hsfreq_range *hsfreq_ranges = drv_data->hsfreq_ranges;
13621387 int num_hsfreq_ranges = drv_data->num_hsfreq_ranges;
13631388 int i, hsfreq = 0;
13641389 u32 val = 0;
13651390 u32 clk_mode = 0x03;
1391
+
1392
+ if (!sensor_sd)
1393
+ return -ENODEV;
1394
+ sensor = sd_to_sensor(priv, sensor_sd);
1395
+ if (!sensor)
1396
+ return -ENODEV;
13661397
13671398 write_grf_reg(priv, GRF_DVP_V18SEL, 0x1);
13681399
....@@ -1378,7 +1409,7 @@
13781409 write_csiphy_reg(priv, CSIPHY_CTRL_PWRCTL, 0xe0);
13791410 usleep_range(500, 1000);
13801411
1381
- if (sensor->mbus.type == V4L2_MBUS_CSI2) {
1412
+ if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
13821413 /* Reset dphy digital part */
13831414 write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1e);
13841415 write_csiphy_reg(priv, CSIPHY_CTRL_DIG_RST, 0x1f);
....@@ -1652,7 +1683,8 @@
16521683 notifier);
16531684 struct mipidphy_sensor *sensor = sd_to_sensor(priv, sd);
16541685
1655
- sensor->sd = NULL;
1686
+ if (sensor)
1687
+ sensor->sd = NULL;
16561688 }
16571689
16581690 static const struct
....@@ -1674,8 +1706,8 @@
16741706 return -EINVAL;
16751707 }
16761708
1677
- if (vep->bus_type == V4L2_MBUS_CSI2) {
1678
- config->type = V4L2_MBUS_CSI2;
1709
+ if (vep->bus_type == V4L2_MBUS_CSI2_DPHY) {
1710
+ config->type = V4L2_MBUS_CSI2_DPHY;
16791711 config->flags = vep->bus.mipi_csi2.flags;
16801712 s_asd->lanes = vep->bus.mipi_csi2.num_data_lanes;
16811713 } else if (vep->bus_type == V4L2_MBUS_CCP2) {
....@@ -1721,15 +1753,14 @@
17211753 if (ret < 0)
17221754 return ret;
17231755
1756
+ v4l2_async_notifier_init(&priv->notifier);
1757
+
17241758 ret = v4l2_async_notifier_parse_fwnode_endpoints_by_port(
17251759 priv->dev, &priv->notifier,
17261760 sizeof(struct sensor_async_subdev), 0,
17271761 rockchip_mipidphy_fwnode_parse);
17281762 if (ret < 0)
17291763 return ret;
1730
-
1731
- if (!priv->notifier.num_subdevs)
1732
- return -ENODEV; /* no endpoint */
17331764
17341765 priv->sd.subdev_notifier = &priv->notifier;
17351766 priv->notifier.ops = &rockchip_mipidphy_async_ops;