forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
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 }
....@@ -1350,10 +1353,9 @@
13501353 }
13511354
13521355 te_gpio_irq = gpio_to_irq(dsi->te_gpio);
1353
- irq_set_status_flags(te_gpio_irq, IRQ_NOAUTOEN);
13541356
13551357 ret = request_threaded_irq(te_gpio_irq, exynos_dsi_te_irq_handler, NULL,
1356
- IRQF_TRIGGER_RISING, "TE", dsi);
1358
+ IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi);
13571359 if (ret) {
13581360 dev_err(dsi->dev, "request interrupt failed with %d\n", ret);
13591361 gpio_free(dsi->te_gpio);
....@@ -1376,40 +1378,57 @@
13761378 static void exynos_dsi_enable(struct drm_encoder *encoder)
13771379 {
13781380 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
1381
+ struct drm_bridge *iter;
13791382 int ret;
13801383
13811384 if (dsi->state & DSIM_STATE_ENABLED)
13821385 return;
13831386
13841387 pm_runtime_get_sync(dsi->dev);
1385
-
13861388 dsi->state |= DSIM_STATE_ENABLED;
13871389
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;
1390
+ if (dsi->panel) {
1391
+ ret = drm_panel_prepare(dsi->panel);
1392
+ if (ret < 0)
1393
+ goto err_put_sync;
1394
+ } else {
1395
+ list_for_each_entry_reverse(iter, &dsi->bridge_chain,
1396
+ chain_node) {
1397
+ if (iter->funcs->pre_enable)
1398
+ iter->funcs->pre_enable(iter);
1399
+ }
13931400 }
13941401
13951402 exynos_dsi_set_display_mode(dsi);
13961403 exynos_dsi_set_display_enable(dsi, true);
13971404
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;
1405
+ if (dsi->panel) {
1406
+ ret = drm_panel_enable(dsi->panel);
1407
+ if (ret < 0)
1408
+ goto err_display_disable;
1409
+ } else {
1410
+ list_for_each_entry(iter, &dsi->bridge_chain, chain_node) {
1411
+ if (iter->funcs->enable)
1412
+ iter->funcs->enable(iter);
1413
+ }
14051414 }
14061415
14071416 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE;
1417
+ return;
1418
+
1419
+err_display_disable:
1420
+ exynos_dsi_set_display_enable(dsi, false);
1421
+ drm_panel_unprepare(dsi->panel);
1422
+
1423
+err_put_sync:
1424
+ dsi->state &= ~DSIM_STATE_ENABLED;
1425
+ pm_runtime_put(dsi->dev);
14081426 }
14091427
14101428 static void exynos_dsi_disable(struct drm_encoder *encoder)
14111429 {
14121430 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
1431
+ struct drm_bridge *iter;
14131432
14141433 if (!(dsi->state & DSIM_STATE_ENABLED))
14151434 return;
....@@ -1417,11 +1436,21 @@
14171436 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE;
14181437
14191438 drm_panel_disable(dsi->panel);
1439
+
1440
+ list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) {
1441
+ if (iter->funcs->disable)
1442
+ iter->funcs->disable(iter);
1443
+ }
1444
+
14201445 exynos_dsi_set_display_enable(dsi, false);
14211446 drm_panel_unprepare(dsi->panel);
14221447
1423
- dsi->state &= ~DSIM_STATE_ENABLED;
1448
+ list_for_each_entry(iter, &dsi->bridge_chain, chain_node) {
1449
+ if (iter->funcs->post_disable)
1450
+ iter->funcs->post_disable(iter);
1451
+ }
14241452
1453
+ dsi->state &= ~DSIM_STATE_ENABLED;
14251454 pm_runtime_put_sync(dsi->dev);
14261455 }
14271456
....@@ -1452,7 +1481,7 @@
14521481 struct exynos_dsi *dsi = connector_to_dsi(connector);
14531482
14541483 if (dsi->panel)
1455
- return dsi->panel->funcs->get_modes(dsi->panel);
1484
+ return drm_panel_get_modes(dsi->panel, connector);
14561485
14571486 return 0;
14581487 }
....@@ -1465,22 +1494,27 @@
14651494 {
14661495 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
14671496 struct drm_connector *connector = &dsi->connector;
1497
+ struct drm_device *drm = encoder->dev;
14681498 int ret;
14691499
14701500 connector->polled = DRM_CONNECTOR_POLL_HPD;
14711501
1472
- ret = drm_connector_init(encoder->dev, connector,
1473
- &exynos_dsi_connector_funcs,
1502
+ ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
14741503 DRM_MODE_CONNECTOR_DSI);
14751504 if (ret) {
1476
- DRM_ERROR("Failed to initialize connector with drm\n");
1505
+ DRM_DEV_ERROR(dsi->dev,
1506
+ "Failed to initialize connector with drm\n");
14771507 return ret;
14781508 }
14791509
14801510 connector->status = connector_status_disconnected;
14811511 drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
14821512 drm_connector_attach_encoder(connector, encoder);
1513
+ if (!drm->registered)
1514
+ return 0;
14831515
1516
+ connector->funcs->reset(connector);
1517
+ drm_connector_register(connector);
14841518 return 0;
14851519 }
14861520
....@@ -1489,17 +1523,38 @@
14891523 .disable = exynos_dsi_disable,
14901524 };
14911525
1492
-static const struct drm_encoder_funcs exynos_dsi_encoder_funcs = {
1493
- .destroy = drm_encoder_cleanup,
1494
-};
1495
-
14961526 MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
14971527
14981528 static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
14991529 struct mipi_dsi_device *device)
15001530 {
15011531 struct exynos_dsi *dsi = host_to_dsi(host);
1502
- struct drm_device *drm = dsi->connector.dev;
1532
+ struct drm_encoder *encoder = &dsi->encoder;
1533
+ struct drm_device *drm = encoder->dev;
1534
+ struct drm_bridge *out_bridge;
1535
+
1536
+ out_bridge = of_drm_find_bridge(device->dev.of_node);
1537
+ if (out_bridge) {
1538
+ drm_bridge_attach(encoder, out_bridge, NULL, 0);
1539
+ dsi->out_bridge = out_bridge;
1540
+ list_splice_init(&encoder->bridge_chain, &dsi->bridge_chain);
1541
+ } else {
1542
+ int ret = exynos_dsi_create_connector(encoder);
1543
+
1544
+ if (ret) {
1545
+ DRM_DEV_ERROR(dsi->dev,
1546
+ "failed to create connector ret = %d\n",
1547
+ ret);
1548
+ drm_encoder_cleanup(encoder);
1549
+ return ret;
1550
+ }
1551
+
1552
+ dsi->panel = of_drm_find_panel(device->dev.of_node);
1553
+ if (IS_ERR(dsi->panel))
1554
+ dsi->panel = NULL;
1555
+ else
1556
+ dsi->connector.status = connector_status_connected;
1557
+ }
15031558
15041559 /*
15051560 * This is a temporary solution and should be made by more generic way.
....@@ -1518,14 +1573,6 @@
15181573 dsi->lanes = device->lanes;
15191574 dsi->format = device->format;
15201575 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
- }
15291576 exynos_drm_crtc_get_by_type(drm, EXYNOS_DISPLAY_TYPE_LCD)->i80_mode =
15301577 !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO);
15311578
....@@ -1541,18 +1588,20 @@
15411588 struct mipi_dsi_device *device)
15421589 {
15431590 struct exynos_dsi *dsi = host_to_dsi(host);
1544
- struct drm_device *drm = dsi->connector.dev;
1545
-
1546
- mutex_lock(&drm->mode_config.mutex);
1591
+ struct drm_device *drm = dsi->encoder.dev;
15471592
15481593 if (dsi->panel) {
1594
+ mutex_lock(&drm->mode_config.mutex);
15491595 exynos_dsi_disable(&dsi->encoder);
1550
- drm_panel_detach(dsi->panel);
15511596 dsi->panel = NULL;
15521597 dsi->connector.status = connector_status_disconnected;
1598
+ mutex_unlock(&drm->mode_config.mutex);
1599
+ } else {
1600
+ if (dsi->out_bridge->funcs->detach)
1601
+ dsi->out_bridge->funcs->detach(dsi->out_bridge);
1602
+ dsi->out_bridge = NULL;
1603
+ INIT_LIST_HEAD(&dsi->bridge_chain);
15531604 }
1554
-
1555
- mutex_unlock(&drm->mode_config.mutex);
15561605
15571606 if (drm->mode_config.poll_enabled)
15581607 drm_kms_helper_hotplug_event(drm);
....@@ -1634,7 +1683,7 @@
16341683 if (ret < 0)
16351684 return ret;
16361685
1637
- dsi->bridge_node = of_graph_get_remote_node(node, DSI_PORT_IN, 0);
1686
+ dsi->in_bridge_node = of_graph_get_remote_node(node, DSI_PORT_IN, 0);
16381687
16391688 return 0;
16401689 }
....@@ -1645,11 +1694,10 @@
16451694 struct drm_encoder *encoder = dev_get_drvdata(dev);
16461695 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
16471696 struct drm_device *drm_dev = data;
1648
- struct drm_bridge *bridge;
1697
+ struct drm_bridge *in_bridge;
16491698 int ret;
16501699
1651
- drm_encoder_init(drm_dev, encoder, &exynos_dsi_encoder_funcs,
1652
- DRM_MODE_ENCODER_TMDS, NULL);
1700
+ drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
16531701
16541702 drm_encoder_helper_add(encoder, &exynos_dsi_encoder_helper_funcs);
16551703
....@@ -1657,17 +1705,10 @@
16571705 if (ret < 0)
16581706 return ret;
16591707
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);
1708
+ if (dsi->in_bridge_node) {
1709
+ in_bridge = of_drm_find_bridge(dsi->in_bridge_node);
1710
+ if (in_bridge)
1711
+ drm_bridge_attach(encoder, in_bridge, NULL, 0);
16711712 }
16721713
16731714 return mipi_dsi_host_register(&dsi->dsi_host);
....@@ -1706,6 +1747,7 @@
17061747 init_completion(&dsi->completed);
17071748 spin_lock_init(&dsi->transfer_lock);
17081749 INIT_LIST_HEAD(&dsi->transfer_list);
1750
+ INIT_LIST_HEAD(&dsi->bridge_chain);
17091751
17101752 dsi->dsi_host.ops = &exynos_dsi_ops;
17111753 dsi->dsi_host.dev = dev;
....@@ -1713,19 +1755,12 @@
17131755 dsi->dev = dev;
17141756 dsi->driver_data = of_device_get_match_data(dev);
17151757
1716
- ret = exynos_dsi_parse_dt(dsi);
1717
- if (ret)
1718
- return ret;
1719
-
17201758 dsi->supplies[0].supply = "vddcore";
17211759 dsi->supplies[1].supply = "vddio";
17221760 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies),
17231761 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
- }
1762
+ if (ret)
1763
+ return dev_err_probe(dev, ret, "failed to get regulators\n");
17291764
17301765 dsi->clks = devm_kcalloc(dev,
17311766 dsi->driver_data->num_clks, sizeof(*dsi->clks),
....@@ -1763,32 +1798,44 @@
17631798 }
17641799
17651800 dsi->irq = platform_get_irq(pdev, 0);
1766
- if (dsi->irq < 0) {
1767
- dev_err(dev, "failed to request dsi irq resource\n");
1801
+ if (dsi->irq < 0)
17681802 return dsi->irq;
1769
- }
17701803
1771
- irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN);
17721804 ret = devm_request_threaded_irq(dev, dsi->irq, NULL,
1773
- exynos_dsi_irq, IRQF_ONESHOT,
1805
+ exynos_dsi_irq,
1806
+ IRQF_ONESHOT | IRQF_NO_AUTOEN,
17741807 dev_name(dev), dsi);
17751808 if (ret) {
17761809 dev_err(dev, "failed to request dsi irq\n");
17771810 return ret;
17781811 }
17791812
1813
+ ret = exynos_dsi_parse_dt(dsi);
1814
+ if (ret)
1815
+ return ret;
1816
+
17801817 platform_set_drvdata(pdev, &dsi->encoder);
17811818
17821819 pm_runtime_enable(dev);
17831820
1784
- return component_add(dev, &exynos_dsi_component_ops);
1821
+ ret = component_add(dev, &exynos_dsi_component_ops);
1822
+ if (ret)
1823
+ goto err_disable_runtime;
1824
+
1825
+ return 0;
1826
+
1827
+err_disable_runtime:
1828
+ pm_runtime_disable(dev);
1829
+ of_node_put(dsi->in_bridge_node);
1830
+
1831
+ return ret;
17851832 }
17861833
17871834 static int exynos_dsi_remove(struct platform_device *pdev)
17881835 {
17891836 struct exynos_dsi *dsi = platform_get_drvdata(pdev);
17901837
1791
- of_node_put(dsi->bridge_node);
1838
+ of_node_put(dsi->in_bridge_node);
17921839
17931840 pm_runtime_disable(&pdev->dev);
17941841