forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/tegra/dsi.c
....@@ -1,28 +1,28 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2013 NVIDIA Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
74 */
85
96 #include <linux/clk.h>
107 #include <linux/debugfs.h>
8
+#include <linux/delay.h>
119 #include <linux/host1x.h>
1210 #include <linux/module.h>
1311 #include <linux/of.h>
1412 #include <linux/of_platform.h>
1513 #include <linux/platform_device.h>
1614 #include <linux/pm_runtime.h>
15
+#include <linux/regulator/consumer.h>
1716 #include <linux/reset.h>
1817
19
-#include <linux/regulator/consumer.h>
18
+#include <video/mipi_display.h>
2019
2120 #include <drm/drm_atomic_helper.h>
21
+#include <drm/drm_debugfs.h>
22
+#include <drm/drm_file.h>
2223 #include <drm/drm_mipi_dsi.h>
2324 #include <drm/drm_panel.h>
24
-
25
-#include <video/mipi_display.h>
25
+#include <drm/drm_simple_kms_helper.h>
2626
2727 #include "dc.h"
2828 #include "drm.h"
....@@ -235,7 +235,6 @@
235235 struct drm_minor *minor = connector->dev->primary;
236236 struct dentry *root = connector->debugfs_entry;
237237 struct tegra_dsi *dsi = to_dsi(output);
238
- int err;
239238
240239 dsi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
241240 GFP_KERNEL);
....@@ -245,17 +244,9 @@
245244 for (i = 0; i < count; i++)
246245 dsi->debugfs_files[i].data = dsi;
247246
248
- err = drm_debugfs_create_files(dsi->debugfs_files, count, root, minor);
249
- if (err < 0)
250
- goto free;
247
+ drm_debugfs_create_files(dsi->debugfs_files, count, root, minor);
251248
252249 return 0;
253
-
254
-free:
255
- kfree(dsi->debugfs_files);
256
- dsi->debugfs_files = NULL;
257
-
258
- return err;
259250 }
260251
261252 static void tegra_dsi_early_unregister(struct drm_connector *connector)
....@@ -679,6 +670,7 @@
679670 static int tegra_dsi_pad_calibrate(struct tegra_dsi *dsi)
680671 {
681672 u32 value;
673
+ int err;
682674
683675 /*
684676 * XXX Is this still needed? The module reset is deasserted right
....@@ -702,7 +694,11 @@
702694 DSI_PAD_PREEMP_PD(0x03) | DSI_PAD_PREEMP_PU(0x3);
703695 tegra_dsi_writel(dsi, value, DSI_PAD_CONTROL_3);
704696
705
- return tegra_mipi_calibrate(dsi->mipi);
697
+ err = tegra_mipi_start_calibration(dsi->mipi);
698
+ if (err < 0)
699
+ return err;
700
+
701
+ return tegra_mipi_finish_calibration(dsi->mipi);
706702 }
707703
708704 static void tegra_dsi_set_timeout(struct tegra_dsi *dsi, unsigned long bclk,
....@@ -825,10 +821,6 @@
825821 .mode_valid = tegra_dsi_connector_mode_valid,
826822 };
827823
828
-static const struct drm_encoder_funcs tegra_dsi_encoder_funcs = {
829
- .destroy = tegra_output_encoder_destroy,
830
-};
831
-
832824 static void tegra_dsi_unprepare(struct tegra_dsi *dsi)
833825 {
834826 int err;
....@@ -841,7 +833,9 @@
841833 dev_err(dsi->dev, "failed to disable MIPI calibration: %d\n",
842834 err);
843835
844
- pm_runtime_put(dsi->dev);
836
+ err = host1x_client_suspend(&dsi->client);
837
+ if (err < 0)
838
+ dev_err(dsi->dev, "failed to suspend: %d\n", err);
845839 }
846840
847841 static void tegra_dsi_encoder_disable(struct drm_encoder *encoder)
....@@ -883,11 +877,15 @@
883877 tegra_dsi_unprepare(dsi);
884878 }
885879
886
-static void tegra_dsi_prepare(struct tegra_dsi *dsi)
880
+static int tegra_dsi_prepare(struct tegra_dsi *dsi)
887881 {
888882 int err;
889883
890
- pm_runtime_get_sync(dsi->dev);
884
+ err = host1x_client_resume(&dsi->client);
885
+ if (err < 0) {
886
+ dev_err(dsi->dev, "failed to resume: %d\n", err);
887
+ return err;
888
+ }
891889
892890 err = tegra_mipi_enable(dsi->mipi);
893891 if (err < 0)
....@@ -900,6 +898,8 @@
900898
901899 if (dsi->slave)
902900 tegra_dsi_prepare(dsi->slave);
901
+
902
+ return 0;
903903 }
904904
905905 static void tegra_dsi_encoder_enable(struct drm_encoder *encoder)
....@@ -910,8 +910,13 @@
910910 struct tegra_dsi *dsi = to_dsi(output);
911911 struct tegra_dsi_state *state;
912912 u32 value;
913
+ int err;
913914
914
- tegra_dsi_prepare(dsi);
915
+ err = tegra_dsi_prepare(dsi);
916
+ if (err < 0) {
917
+ dev_err(dsi->dev, "failed to prepare: %d\n", err);
918
+ return;
919
+ }
915920
916921 state = tegra_dsi_get_state(dsi);
917922
....@@ -1031,7 +1036,7 @@
10311036
10321037 static int tegra_dsi_init(struct host1x_client *client)
10331038 {
1034
- struct drm_device *drm = dev_get_drvdata(client->parent);
1039
+ struct drm_device *drm = dev_get_drvdata(client->host);
10351040 struct tegra_dsi *dsi = host1x_client_to_dsi(client);
10361041 int err;
10371042
....@@ -1046,9 +1051,8 @@
10461051 &tegra_dsi_connector_helper_funcs);
10471052 dsi->output.connector.dpms = DRM_MODE_DPMS_OFF;
10481053
1049
- drm_encoder_init(drm, &dsi->output.encoder,
1050
- &tegra_dsi_encoder_funcs,
1051
- DRM_MODE_ENCODER_DSI, NULL);
1054
+ drm_simple_encoder_init(drm, &dsi->output.encoder,
1055
+ DRM_MODE_ENCODER_DSI);
10521056 drm_encoder_helper_add(&dsi->output.encoder,
10531057 &tegra_dsi_encoder_helper_funcs);
10541058
....@@ -1076,9 +1080,89 @@
10761080 return 0;
10771081 }
10781082
1083
+static int tegra_dsi_runtime_suspend(struct host1x_client *client)
1084
+{
1085
+ struct tegra_dsi *dsi = host1x_client_to_dsi(client);
1086
+ struct device *dev = client->dev;
1087
+ int err;
1088
+
1089
+ if (dsi->rst) {
1090
+ err = reset_control_assert(dsi->rst);
1091
+ if (err < 0) {
1092
+ dev_err(dev, "failed to assert reset: %d\n", err);
1093
+ return err;
1094
+ }
1095
+ }
1096
+
1097
+ usleep_range(1000, 2000);
1098
+
1099
+ clk_disable_unprepare(dsi->clk_lp);
1100
+ clk_disable_unprepare(dsi->clk);
1101
+
1102
+ regulator_disable(dsi->vdd);
1103
+ pm_runtime_put_sync(dev);
1104
+
1105
+ return 0;
1106
+}
1107
+
1108
+static int tegra_dsi_runtime_resume(struct host1x_client *client)
1109
+{
1110
+ struct tegra_dsi *dsi = host1x_client_to_dsi(client);
1111
+ struct device *dev = client->dev;
1112
+ int err;
1113
+
1114
+ err = pm_runtime_resume_and_get(dev);
1115
+ if (err < 0) {
1116
+ dev_err(dev, "failed to get runtime PM: %d\n", err);
1117
+ return err;
1118
+ }
1119
+
1120
+ err = regulator_enable(dsi->vdd);
1121
+ if (err < 0) {
1122
+ dev_err(dev, "failed to enable VDD supply: %d\n", err);
1123
+ goto put_rpm;
1124
+ }
1125
+
1126
+ err = clk_prepare_enable(dsi->clk);
1127
+ if (err < 0) {
1128
+ dev_err(dev, "cannot enable DSI clock: %d\n", err);
1129
+ goto disable_vdd;
1130
+ }
1131
+
1132
+ err = clk_prepare_enable(dsi->clk_lp);
1133
+ if (err < 0) {
1134
+ dev_err(dev, "cannot enable low-power clock: %d\n", err);
1135
+ goto disable_clk;
1136
+ }
1137
+
1138
+ usleep_range(1000, 2000);
1139
+
1140
+ if (dsi->rst) {
1141
+ err = reset_control_deassert(dsi->rst);
1142
+ if (err < 0) {
1143
+ dev_err(dev, "cannot assert reset: %d\n", err);
1144
+ goto disable_clk_lp;
1145
+ }
1146
+ }
1147
+
1148
+ return 0;
1149
+
1150
+disable_clk_lp:
1151
+ clk_disable_unprepare(dsi->clk_lp);
1152
+disable_clk:
1153
+ clk_disable_unprepare(dsi->clk);
1154
+disable_vdd:
1155
+ regulator_disable(dsi->vdd);
1156
+put_rpm:
1157
+ pm_runtime_put_sync(dev);
1158
+ return err;
1159
+}
1160
+
10791161 static const struct host1x_client_ops dsi_client_ops = {
10801162 .init = tegra_dsi_init,
10811163 .exit = tegra_dsi_exit,
1164
+ .suspend = tegra_dsi_runtime_suspend,
1165
+ .resume = tegra_dsi_runtime_resume,
10821166 };
10831167
10841168 static int tegra_dsi_setup_clocks(struct tegra_dsi *dsi)
....@@ -1414,10 +1498,8 @@
14141498 if (IS_ERR(output->panel))
14151499 output->panel = NULL;
14161500
1417
- if (output->panel && output->connector.dev) {
1418
- drm_panel_attach(output->panel, &output->connector);
1501
+ if (output->panel && output->connector.dev)
14191502 drm_helper_hpd_irq_event(output->connector.dev);
1420
- }
14211503 }
14221504
14231505 return 0;
....@@ -1456,8 +1538,10 @@
14561538 dsi->slave = platform_get_drvdata(gangster);
14571539 of_node_put(np);
14581540
1459
- if (!dsi->slave)
1541
+ if (!dsi->slave) {
1542
+ put_device(&gangster->dev);
14601543 return -EPROBE_DEFER;
1544
+ }
14611545
14621546 dsi->slave->master = dsi;
14631547 }
....@@ -1539,7 +1623,7 @@
15391623 if (IS_ERR(dsi->regs))
15401624 return PTR_ERR(dsi->regs);
15411625
1542
- dsi->mipi = tegra_mipi_request(&pdev->dev);
1626
+ dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node);
15431627 if (IS_ERR(dsi->mipi))
15441628 return PTR_ERR(dsi->mipi);
15451629
....@@ -1597,79 +1681,6 @@
15971681 return 0;
15981682 }
15991683
1600
-#ifdef CONFIG_PM
1601
-static int tegra_dsi_suspend(struct device *dev)
1602
-{
1603
- struct tegra_dsi *dsi = dev_get_drvdata(dev);
1604
- int err;
1605
-
1606
- if (dsi->rst) {
1607
- err = reset_control_assert(dsi->rst);
1608
- if (err < 0) {
1609
- dev_err(dev, "failed to assert reset: %d\n", err);
1610
- return err;
1611
- }
1612
- }
1613
-
1614
- usleep_range(1000, 2000);
1615
-
1616
- clk_disable_unprepare(dsi->clk_lp);
1617
- clk_disable_unprepare(dsi->clk);
1618
-
1619
- regulator_disable(dsi->vdd);
1620
-
1621
- return 0;
1622
-}
1623
-
1624
-static int tegra_dsi_resume(struct device *dev)
1625
-{
1626
- struct tegra_dsi *dsi = dev_get_drvdata(dev);
1627
- int err;
1628
-
1629
- err = regulator_enable(dsi->vdd);
1630
- if (err < 0) {
1631
- dev_err(dsi->dev, "failed to enable VDD supply: %d\n", err);
1632
- return err;
1633
- }
1634
-
1635
- err = clk_prepare_enable(dsi->clk);
1636
- if (err < 0) {
1637
- dev_err(dev, "cannot enable DSI clock: %d\n", err);
1638
- goto disable_vdd;
1639
- }
1640
-
1641
- err = clk_prepare_enable(dsi->clk_lp);
1642
- if (err < 0) {
1643
- dev_err(dev, "cannot enable low-power clock: %d\n", err);
1644
- goto disable_clk;
1645
- }
1646
-
1647
- usleep_range(1000, 2000);
1648
-
1649
- if (dsi->rst) {
1650
- err = reset_control_deassert(dsi->rst);
1651
- if (err < 0) {
1652
- dev_err(dev, "cannot assert reset: %d\n", err);
1653
- goto disable_clk_lp;
1654
- }
1655
- }
1656
-
1657
- return 0;
1658
-
1659
-disable_clk_lp:
1660
- clk_disable_unprepare(dsi->clk_lp);
1661
-disable_clk:
1662
- clk_disable_unprepare(dsi->clk);
1663
-disable_vdd:
1664
- regulator_disable(dsi->vdd);
1665
- return err;
1666
-}
1667
-#endif
1668
-
1669
-static const struct dev_pm_ops tegra_dsi_pm_ops = {
1670
- SET_RUNTIME_PM_OPS(tegra_dsi_suspend, tegra_dsi_resume, NULL)
1671
-};
1672
-
16731684 static const struct of_device_id tegra_dsi_of_match[] = {
16741685 { .compatible = "nvidia,tegra210-dsi", },
16751686 { .compatible = "nvidia,tegra132-dsi", },
....@@ -1683,7 +1694,6 @@
16831694 .driver = {
16841695 .name = "tegra-dsi",
16851696 .of_match_table = tegra_dsi_of_match,
1686
- .pm = &tegra_dsi_pm_ops,
16871697 },
16881698 .probe = tegra_dsi_probe,
16891699 .remove = tegra_dsi_remove,