hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
....@@ -32,6 +32,7 @@
3232
3333 #include "analogix_dp_core.h"
3434 #include "analogix_dp_reg.h"
35
+#include "../../rockchip/rockchip_drm_drv.h"
3536
3637 #define to_dp(nm) container_of(nm, struct analogix_dp_device, nm)
3738
....@@ -51,6 +52,9 @@
5152 struct i2c_client *client;
5253 struct device_node *node;
5354 };
55
+
56
+static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
57
+ const struct drm_display_mode *adj_mode);
5458
5559 static bool analogix_dp_bandwidth_ok(struct analogix_dp_device *dp,
5660 const struct drm_display_mode *mode,
....@@ -1442,6 +1446,32 @@
14421446 extcon_set_state_sync(dp->extcon, EXTCON_DISP_DP, false);
14431447 }
14441448
1449
+static int
1450
+analogix_dp_atomic_connector_get_property(struct drm_connector *connector,
1451
+ const struct drm_connector_state *state,
1452
+ struct drm_property *property,
1453
+ uint64_t *val)
1454
+{
1455
+ struct rockchip_drm_private *private = connector->dev->dev_private;
1456
+ struct analogix_dp_device *dp = to_dp(connector);
1457
+
1458
+ if (property == private->split_area_prop) {
1459
+ switch (dp->split_area) {
1460
+ case 1:
1461
+ *val = ROCKCHIP_DRM_SPLIT_LEFT_SIDE;
1462
+ break;
1463
+ case 2:
1464
+ *val = ROCKCHIP_DRM_SPLIT_RIGHT_SIDE;
1465
+ break;
1466
+ default:
1467
+ *val = ROCKCHIP_DRM_SPLIT_UNSET;
1468
+ break;
1469
+ }
1470
+ }
1471
+
1472
+ return 0;
1473
+}
1474
+
14451475 static const struct drm_connector_funcs analogix_dp_connector_funcs = {
14461476 .fill_modes = drm_helper_probe_single_connector_modes,
14471477 .detect = analogix_dp_connector_detect,
....@@ -1450,6 +1480,7 @@
14501480 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
14511481 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
14521482 .force = analogix_dp_connector_force,
1483
+ .atomic_get_property = analogix_dp_atomic_connector_get_property,
14531484 };
14541485
14551486 static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
....@@ -1480,6 +1511,7 @@
14801511
14811512 if (!dp->plat_data->skip_connector) {
14821513 int connector_type = DRM_MODE_CONNECTOR_eDP;
1514
+ struct rockchip_drm_private *private;
14831515
14841516 if (dp->plat_data->bridge &&
14851517 dp->plat_data->bridge->type != DRM_MODE_CONNECTOR_Unknown)
....@@ -1498,6 +1530,13 @@
14981530 DRM_ERROR("Failed to initialize connector with drm\n");
14991531 return ret;
15001532 }
1533
+
1534
+ private = connector->dev->dev_private;
1535
+
1536
+ if (dp->split_area)
1537
+ drm_object_attach_property(&connector->base,
1538
+ private->split_area_prop,
1539
+ dp->split_area);
15011540
15021541 drm_connector_helper_add(connector,
15031542 &analogix_dp_connector_helper_funcs);
....@@ -1575,13 +1614,17 @@
15751614 struct drm_atomic_state *old_state = old_bridge_state->base.state;
15761615 struct analogix_dp_device *dp = bridge->driver_private;
15771616 struct drm_crtc *crtc;
1578
- struct drm_crtc_state *old_crtc_state;
1617
+ struct drm_crtc_state *old_crtc_state, *new_crtc_state;
15791618
15801619 crtc = analogix_dp_get_new_crtc(dp, old_state);
15811620 if (!crtc)
15821621 return;
15831622
15841623 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
1624
+
1625
+ new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
1626
+ analogix_dp_bridge_mode_set(bridge, &new_crtc_state->adjusted_mode);
1627
+
15851628 /* Don't touch the panel if we're coming back from PSR */
15861629 if (old_crtc_state && old_crtc_state->self_refresh_active)
15871630 return;
....@@ -1790,7 +1833,6 @@
17901833 }
17911834
17921835 static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
1793
- const struct drm_display_mode *orig_mode,
17941836 const struct drm_display_mode *adj_mode)
17951837 {
17961838 struct analogix_dp_device *dp = bridge->driver_private;
....@@ -1910,7 +1952,7 @@
19101952
19111953 drm_mode_copy(&m, mode);
19121954
1913
- if (dp->plat_data->split_mode)
1955
+ if (dp->plat_data->split_mode || dp->plat_data->dual_connector_split)
19141956 dp->plat_data->convert_to_origin_mode(&m);
19151957
19161958 max_link_rate = min_t(u32, dp->video_info.max_link_rate,
....@@ -1934,7 +1976,6 @@
19341976 .atomic_enable = analogix_dp_bridge_atomic_enable,
19351977 .atomic_disable = analogix_dp_bridge_atomic_disable,
19361978 .atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
1937
- .mode_set = analogix_dp_bridge_mode_set,
19381979 .attach = analogix_dp_bridge_attach,
19391980 .detach = analogix_dp_bridge_detach,
19401981 .mode_valid = analogix_dp_bridge_mode_valid,
....@@ -2073,6 +2114,9 @@
20732114 return ret;
20742115 }
20752116
2117
+ if (device_property_read_u32(dp->dev, "split-area", &dp->split_area))
2118
+ dp->split_area = 0;
2119
+
20762120 return 0;
20772121 }
20782122