forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/drivers/gpu/drm/exynos/exynos_drm_dsi.c
....@@ -1,24 +1,15 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Samsung SoC MIPI DSI Master driver.
34 *
45 * Copyright (c) 2014 Samsung Electronics Co., Ltd
56 *
67 * Contacts: Tomasz Figa <t.figa@samsung.com>
7
- *
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
118 */
129
13
-#include <asm/unaligned.h>
14
-
15
-#include <drm/drmP.h>
16
-#include <drm/drm_crtc_helper.h>
17
-#include <drm/drm_mipi_dsi.h>
18
-#include <drm/drm_panel.h>
19
-#include <drm/drm_atomic_helper.h>
20
-
2110 #include <linux/clk.h>
11
+#include <linux/delay.h>
12
+#include <linux/component.h>
2213 #include <linux/gpio/consumer.h>
2314 #include <linux/irq.h>
2415 #include <linux/of_device.h>
....@@ -26,10 +17,20 @@
2617 #include <linux/of_graph.h>
2718 #include <linux/phy/phy.h>
2819 #include <linux/regulator/consumer.h>
29
-#include <linux/component.h>
20
+
21
+#include <asm/unaligned.h>
3022
3123 #include <video/mipi_display.h>
3224 #include <video/videomode.h>
25
+
26
+#include <drm/drm_atomic_helper.h>
27
+#include <drm/drm_bridge.h>
28
+#include <drm/drm_fb_helper.h>
29
+#include <drm/drm_mipi_dsi.h>
30
+#include <drm/drm_panel.h>
31
+#include <drm/drm_print.h>
32
+#include <drm/drm_probe_helper.h>
33
+#include <drm/drm_simple_kms_helper.h>
3334
3435 #include "exynos_drm_crtc.h"
3536 #include "exynos_drm_drv.h"
....@@ -211,7 +212,7 @@
211212
212213 #define OLD_SCLK_MIPI_CLK_NAME "pll_clk"
213214
214
-static char *clk_names[5] = { "bus_clk", "sclk_mipi",
215
+static const char *const clk_names[5] = { "bus_clk", "sclk_mipi",
215216 "phyclk_mipidphy0_bitclkdiv8", "phyclk_mipidphy0_rxclkesc0",
216217 "sclk_rgb_vclk_to_dsim0" };
217218
....@@ -255,6 +256,8 @@
255256 struct mipi_dsi_host dsi_host;
256257 struct drm_connector connector;
257258 struct drm_panel *panel;
259
+ struct list_head bridge_chain;
260
+ struct drm_bridge *out_bridge;
258261 struct device *dev;
259262
260263 void __iomem *reg_base;
....@@ -279,7 +282,7 @@
279282 struct list_head transfer_list;
280283
281284 const struct exynos_dsi_driver_data *driver_data;
282
- struct device_node *bridge_node;
285
+ struct device_node *in_bridge_node;
283286 };
284287
285288 #define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
....@@ -544,9 +547,9 @@
544547 unsigned long best_freq = 0;
545548 u32 min_delta = 0xffffffff;
546549 u8 p_min, p_max;
547
- u8 _p, uninitialized_var(best_p);
548
- u16 _m, uninitialized_var(best_m);
549
- u8 _s, uninitialized_var(best_s);
550
+ u8 _p, best_p;
551
+ u16 _m, best_m;
552
+ u8 _s, best_s;
550553
551554 p_min = DIV_ROUND_UP(fin, (12 * MHZ));
552555 p_max = fin / (6 * MHZ);
....@@ -984,10 +987,10 @@
984987 switch (length) {
985988 case 3:
986989 reg |= payload[2] << 16;
987
- /* Fall through */
990
+ fallthrough;
988991 case 2:
989992 reg |= payload[1] << 8;
990
- /* Fall through */
993
+ fallthrough;
991994 case 1:
992995 reg |= payload[0];
993996 exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg);
....@@ -1035,7 +1038,7 @@
10351038 payload[1] = reg >> 16;
10361039 ++xfer->rx_done;
10371040 }
1038
- /* Fall through */
1041
+ fallthrough;
10391042 case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE:
10401043 case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE:
10411044 payload[0] = reg >> 8;
....@@ -1079,10 +1082,10 @@
10791082 switch (length) {
10801083 case 3:
10811084 payload[2] = (reg >> 16) & 0xff;
1082
- /* Fall through */
1085
+ fallthrough;
10831086 case 2:
10841087 payload[1] = (reg >> 8) & 0xff;
1085
- /* Fall through */
1088
+ fallthrough;
10861089 case 1:
10871090 payload[0] = reg & 0xff;
10881091 }
....@@ -1376,40 +1379,57 @@
13761379 static void exynos_dsi_enable(struct drm_encoder *encoder)
13771380 {
13781381 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
1382
+ struct drm_bridge *iter;
13791383 int ret;
13801384
13811385 if (dsi->state & DSIM_STATE_ENABLED)
13821386 return;
13831387
13841388 pm_runtime_get_sync(dsi->dev);
1385
-
13861389 dsi->state |= DSIM_STATE_ENABLED;
13871390
1388
- ret = drm_panel_prepare(dsi->panel);
1389
- if (ret < 0) {
1390
- dsi->state &= ~DSIM_STATE_ENABLED;
1391
- pm_runtime_put_sync(dsi->dev);
1392
- return;
1391
+ if (dsi->panel) {
1392
+ ret = drm_panel_prepare(dsi->panel);
1393
+ if (ret < 0)
1394
+ goto err_put_sync;
1395
+ } else {
1396
+ list_for_each_entry_reverse(iter, &dsi->bridge_chain,
1397
+ chain_node) {
1398
+ if (iter->funcs->pre_enable)
1399
+ iter->funcs->pre_enable(iter);
1400
+ }
13931401 }
13941402
13951403 exynos_dsi_set_display_mode(dsi);
13961404 exynos_dsi_set_display_enable(dsi, true);
13971405
1398
- ret = drm_panel_enable(dsi->panel);
1399
- if (ret < 0) {
1400
- dsi->state &= ~DSIM_STATE_ENABLED;
1401
- exynos_dsi_set_display_enable(dsi, false);
1402
- drm_panel_unprepare(dsi->panel);
1403
- pm_runtime_put_sync(dsi->dev);
1404
- return;
1406
+ if (dsi->panel) {
1407
+ ret = drm_panel_enable(dsi->panel);
1408
+ if (ret < 0)
1409
+ goto err_display_disable;
1410
+ } else {
1411
+ list_for_each_entry(iter, &dsi->bridge_chain, chain_node) {
1412
+ if (iter->funcs->enable)
1413
+ iter->funcs->enable(iter);
1414
+ }
14051415 }
14061416
14071417 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE;
1418
+ return;
1419
+
1420
+err_display_disable:
1421
+ exynos_dsi_set_display_enable(dsi, false);
1422
+ drm_panel_unprepare(dsi->panel);
1423
+
1424
+err_put_sync:
1425
+ dsi->state &= ~DSIM_STATE_ENABLED;
1426
+ pm_runtime_put(dsi->dev);
14081427 }
14091428
14101429 static void exynos_dsi_disable(struct drm_encoder *encoder)
14111430 {
14121431 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
1432
+ struct drm_bridge *iter;
14131433
14141434 if (!(dsi->state & DSIM_STATE_ENABLED))
14151435 return;
....@@ -1417,11 +1437,21 @@
14171437 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE;
14181438
14191439 drm_panel_disable(dsi->panel);
1440
+
1441
+ list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) {
1442
+ if (iter->funcs->disable)
1443
+ iter->funcs->disable(iter);
1444
+ }
1445
+
14201446 exynos_dsi_set_display_enable(dsi, false);
14211447 drm_panel_unprepare(dsi->panel);
14221448
1423
- dsi->state &= ~DSIM_STATE_ENABLED;
1449
+ list_for_each_entry(iter, &dsi->bridge_chain, chain_node) {
1450
+ if (iter->funcs->post_disable)
1451
+ iter->funcs->post_disable(iter);
1452
+ }
14241453
1454
+ dsi->state &= ~DSIM_STATE_ENABLED;
14251455 pm_runtime_put_sync(dsi->dev);
14261456 }
14271457
....@@ -1452,7 +1482,7 @@
14521482 struct exynos_dsi *dsi = connector_to_dsi(connector);
14531483
14541484 if (dsi->panel)
1455
- return dsi->panel->funcs->get_modes(dsi->panel);
1485
+ return drm_panel_get_modes(dsi->panel, connector);
14561486
14571487 return 0;
14581488 }
....@@ -1465,22 +1495,27 @@
14651495 {
14661496 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
14671497 struct drm_connector *connector = &dsi->connector;
1498
+ struct drm_device *drm = encoder->dev;
14681499 int ret;
14691500
14701501 connector->polled = DRM_CONNECTOR_POLL_HPD;
14711502
1472
- ret = drm_connector_init(encoder->dev, connector,
1473
- &exynos_dsi_connector_funcs,
1503
+ ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
14741504 DRM_MODE_CONNECTOR_DSI);
14751505 if (ret) {
1476
- DRM_ERROR("Failed to initialize connector with drm\n");
1506
+ DRM_DEV_ERROR(dsi->dev,
1507
+ "Failed to initialize connector with drm\n");
14771508 return ret;
14781509 }
14791510
14801511 connector->status = connector_status_disconnected;
14811512 drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
14821513 drm_connector_attach_encoder(connector, encoder);
1514
+ if (!drm->registered)
1515
+ return 0;
14831516
1517
+ connector->funcs->reset(connector);
1518
+ drm_connector_register(connector);
14841519 return 0;
14851520 }
14861521
....@@ -1489,17 +1524,38 @@
14891524 .disable = exynos_dsi_disable,
14901525 };
14911526
1492
-static const struct drm_encoder_funcs exynos_dsi_encoder_funcs = {
1493
- .destroy = drm_encoder_cleanup,
1494
-};
1495
-
14961527 MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
14971528
14981529 static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
14991530 struct mipi_dsi_device *device)
15001531 {
15011532 struct exynos_dsi *dsi = host_to_dsi(host);
1502
- struct drm_device *drm = dsi->connector.dev;
1533
+ struct drm_encoder *encoder = &dsi->encoder;
1534
+ struct drm_device *drm = encoder->dev;
1535
+ struct drm_bridge *out_bridge;
1536
+
1537
+ out_bridge = of_drm_find_bridge(device->dev.of_node);
1538
+ if (out_bridge) {
1539
+ drm_bridge_attach(encoder, out_bridge, NULL, 0);
1540
+ dsi->out_bridge = out_bridge;
1541
+ list_splice_init(&encoder->bridge_chain, &dsi->bridge_chain);
1542
+ } else {
1543
+ int ret = exynos_dsi_create_connector(encoder);
1544
+
1545
+ if (ret) {
1546
+ DRM_DEV_ERROR(dsi->dev,
1547
+ "failed to create connector ret = %d\n",
1548
+ ret);
1549
+ drm_encoder_cleanup(encoder);
1550
+ return ret;
1551
+ }
1552
+
1553
+ dsi->panel = of_drm_find_panel(device->dev.of_node);
1554
+ if (IS_ERR(dsi->panel))
1555
+ dsi->panel = NULL;
1556
+ else
1557
+ dsi->connector.status = connector_status_connected;
1558
+ }
15031559
15041560 /*
15051561 * This is a temporary solution and should be made by more generic way.
....@@ -1518,14 +1574,6 @@
15181574 dsi->lanes = device->lanes;
15191575 dsi->format = device->format;
15201576 dsi->mode_flags = device->mode_flags;
1521
- dsi->panel = of_drm_find_panel(device->dev.of_node);
1522
- if (IS_ERR(dsi->panel))
1523
- dsi->panel = NULL;
1524
-
1525
- if (dsi->panel) {
1526
- drm_panel_attach(dsi->panel, &dsi->connector);
1527
- dsi->connector.status = connector_status_connected;
1528
- }
15291577 exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode =
15301578 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO);
15311579
....@@ -1541,18 +1589,20 @@
15411589 struct mipi_dsi_device *device)
15421590 {
15431591 struct exynos_dsi *dsi = host_to_dsi(host);
1544
- struct drm_device *drm = dsi->connector.dev;
1545
-
1546
- mutex_lock(&drm->mode_config.mutex);
1592
+ struct drm_device *drm = dsi->encoder.dev;
15471593
15481594 if (dsi->panel) {
1595
+ mutex_lock(&drm->mode_config.mutex);
15491596 exynos_dsi_disable(&dsi->encoder);
1550
- drm_panel_detach(dsi->panel);
15511597 dsi->panel = NULL;
15521598 dsi->connector.status = connector_status_disconnected;
1599
+ mutex_unlock(&drm->mode_config.mutex);
1600
+ } else {
1601
+ if (dsi->out_bridge->funcs->detach)
1602
+ dsi->out_bridge->funcs->detach(dsi->out_bridge);
1603
+ dsi->out_bridge = NULL;
1604
+ INIT_LIST_HEAD(&dsi->bridge_chain);
15531605 }
1554
-
1555
- mutex_unlock(&drm->mode_config.mutex);
15561606
15571607 if (drm->mode_config.poll_enabled)
15581608 drm_kms_helper_hotplug_event(drm);
....@@ -1634,7 +1684,7 @@
16341684 if (ret < 0)
16351685 return ret;
16361686
1637
- dsi->bridge_node = of_graph_get_remote_node(node, DSI_PORT_IN, 0);
1687
+ dsi->in_bridge_node = of_graph_get_remote_node(node, DSI_PORT_IN, 0);
16381688
16391689 return 0;
16401690 }
....@@ -1645,11 +1695,10 @@
16451695 struct drm_encoder *encoder = dev_get_drvdata(dev);
16461696 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
16471697 struct drm_device *drm_dev = data;
1648
- struct drm_bridge *bridge;
1698
+ struct drm_bridge *in_bridge;
16491699 int ret;
16501700
1651
- drm_encoder_init(drm_dev, encoder, &exynos_dsi_encoder_funcs,
1652
- DRM_MODE_ENCODER_TMDS, NULL);
1701
+ drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
16531702
16541703 drm_encoder_helper_add(encoder, &exynos_dsi_encoder_helper_funcs);
16551704
....@@ -1657,17 +1706,10 @@
16571706 if (ret < 0)
16581707 return ret;
16591708
1660
- ret = exynos_dsi_create_connector(encoder);
1661
- if (ret) {
1662
- DRM_ERROR("failed to create connector ret = %d\n", ret);
1663
- drm_encoder_cleanup(encoder);
1664
- return ret;
1665
- }
1666
-
1667
- if (dsi->bridge_node) {
1668
- bridge = of_drm_find_bridge(dsi->bridge_node);
1669
- if (bridge)
1670
- drm_bridge_attach(encoder, bridge, NULL);
1709
+ if (dsi->in_bridge_node) {
1710
+ in_bridge = of_drm_find_bridge(dsi->in_bridge_node);
1711
+ if (in_bridge)
1712
+ drm_bridge_attach(encoder, in_bridge, NULL, 0);
16711713 }
16721714
16731715 return mipi_dsi_host_register(&dsi->dsi_host);
....@@ -1706,6 +1748,7 @@
17061748 init_completion(&dsi->completed);
17071749 spin_lock_init(&dsi->transfer_lock);
17081750 INIT_LIST_HEAD(&dsi->transfer_list);
1751
+ INIT_LIST_HEAD(&dsi->bridge_chain);
17091752
17101753 dsi->dsi_host.ops = &exynos_dsi_ops;
17111754 dsi->dsi_host.dev = dev;
....@@ -1713,19 +1756,12 @@
17131756 dsi->dev = dev;
17141757 dsi->driver_data = of_device_get_match_data(dev);
17151758
1716
- ret = exynos_dsi_parse_dt(dsi);
1717
- if (ret)
1718
- return ret;
1719
-
17201759 dsi->supplies[0].supply = "vddcore";
17211760 dsi->supplies[1].supply = "vddio";
17221761 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies),
17231762 dsi->supplies);
1724
- if (ret) {
1725
- if (ret != -EPROBE_DEFER)
1726
- dev_info(dev, "failed to get regulators: %d\n", ret);
1727
- return ret;
1728
- }
1763
+ if (ret)
1764
+ return dev_err_probe(dev, ret, "failed to get regulators\n");
17291765
17301766 dsi->clks = devm_kcalloc(dev,
17311767 dsi->driver_data->num_clks, sizeof(*dsi->clks),
....@@ -1763,10 +1799,8 @@
17631799 }
17641800
17651801 dsi->irq = platform_get_irq(pdev, 0);
1766
- if (dsi->irq < 0) {
1767
- dev_err(dev, "failed to request dsi irq resource\n");
1802
+ if (dsi->irq < 0)
17681803 return dsi->irq;
1769
- }
17701804
17711805 irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN);
17721806 ret = devm_request_threaded_irq(dev, dsi->irq, NULL,
....@@ -1777,18 +1811,32 @@
17771811 return ret;
17781812 }
17791813
1814
+ ret = exynos_dsi_parse_dt(dsi);
1815
+ if (ret)
1816
+ return ret;
1817
+
17801818 platform_set_drvdata(pdev, &dsi->encoder);
17811819
17821820 pm_runtime_enable(dev);
17831821
1784
- return component_add(dev, &exynos_dsi_component_ops);
1822
+ ret = component_add(dev, &exynos_dsi_component_ops);
1823
+ if (ret)
1824
+ goto err_disable_runtime;
1825
+
1826
+ return 0;
1827
+
1828
+err_disable_runtime:
1829
+ pm_runtime_disable(dev);
1830
+ of_node_put(dsi->in_bridge_node);
1831
+
1832
+ return ret;
17851833 }
17861834
17871835 static int exynos_dsi_remove(struct platform_device *pdev)
17881836 {
17891837 struct exynos_dsi *dsi = platform_get_drvdata(pdev);
17901838
1791
- of_node_put(dsi->bridge_node);
1839
+ of_node_put(dsi->in_bridge_node);
17921840
17931841 pm_runtime_disable(&pdev->dev);
17941842