forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/drivers/gpu/drm/vc4/vc4_dpi.c
....@@ -1,17 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) 2016 Broadcom Limited
3
- *
4
- * This program is free software; you can redistribute it and/or modify it
5
- * under the terms of the GNU General Public License version 2 as published by
6
- * the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful, but WITHOUT
9
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
- * more details.
12
- *
13
- * You should have received a copy of the GNU General Public License along with
14
- * this program. If not, see <http://www.gnu.org/licenses/>.
154 */
165
176 /**
....@@ -24,10 +13,11 @@
2413
2514 #include <drm/drm_atomic_helper.h>
2615 #include <drm/drm_bridge.h>
27
-#include <drm/drm_crtc_helper.h>
2816 #include <drm/drm_edid.h>
2917 #include <drm/drm_of.h>
3018 #include <drm/drm_panel.h>
19
+#include <drm/drm_probe_helper.h>
20
+#include <drm/drm_simple_kms_helper.h>
3121 #include <linux/clk.h>
3222 #include <linux/component.h>
3323 #include <linux/of_graph.h>
....@@ -101,6 +91,8 @@
10191
10292 struct clk *pixel_clock;
10393 struct clk *core_clock;
94
+
95
+ struct debugfs_regset32 regset;
10496 };
10597
10698 #define DPI_READ(offset) readl(dpi->regs + (offset))
....@@ -118,39 +110,9 @@
118110 return container_of(encoder, struct vc4_dpi_encoder, base.base);
119111 }
120112
121
-#define DPI_REG(reg) { reg, #reg }
122
-static const struct {
123
- u32 reg;
124
- const char *name;
125
-} dpi_regs[] = {
126
- DPI_REG(DPI_C),
127
- DPI_REG(DPI_ID),
128
-};
129
-
130
-#ifdef CONFIG_DEBUG_FS
131
-int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused)
132
-{
133
- struct drm_info_node *node = (struct drm_info_node *)m->private;
134
- struct drm_device *dev = node->minor->dev;
135
- struct vc4_dev *vc4 = to_vc4_dev(dev);
136
- struct vc4_dpi *dpi = vc4->dpi;
137
- int i;
138
-
139
- if (!dpi)
140
- return 0;
141
-
142
- for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
143
- seq_printf(m, "%s (0x%04x): 0x%08x\n",
144
- dpi_regs[i].name, dpi_regs[i].reg,
145
- DPI_READ(dpi_regs[i].reg));
146
- }
147
-
148
- return 0;
149
-}
150
-#endif
151
-
152
-static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
153
- .destroy = drm_encoder_cleanup,
113
+static const struct debugfs_reg32 dpi_regs[] = {
114
+ VC4_REG32(DPI_C),
115
+ VC4_REG32(DPI_ID),
154116 };
155117
156118 static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)
....@@ -186,35 +148,45 @@
186148 }
187149 drm_connector_list_iter_end(&conn_iter);
188150
189
- if (connector && connector->display_info.num_bus_formats) {
190
- u32 bus_format = connector->display_info.bus_formats[0];
151
+ if (connector) {
152
+ if (connector->display_info.num_bus_formats) {
153
+ u32 bus_format = connector->display_info.bus_formats[0];
191154
192
- switch (bus_format) {
193
- case MEDIA_BUS_FMT_RGB888_1X24:
194
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
195
- DPI_FORMAT);
196
- break;
197
- case MEDIA_BUS_FMT_BGR888_1X24:
198
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
199
- DPI_FORMAT);
200
- dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
201
- break;
202
- case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
203
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
204
- DPI_FORMAT);
205
- break;
206
- case MEDIA_BUS_FMT_RGB666_1X18:
207
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
208
- DPI_FORMAT);
209
- break;
210
- case MEDIA_BUS_FMT_RGB565_1X16:
211
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
212
- DPI_FORMAT);
213
- break;
214
- default:
215
- DRM_ERROR("Unknown media bus format %d\n", bus_format);
216
- break;
155
+ switch (bus_format) {
156
+ case MEDIA_BUS_FMT_RGB888_1X24:
157
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
158
+ DPI_FORMAT);
159
+ break;
160
+ case MEDIA_BUS_FMT_BGR888_1X24:
161
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
162
+ DPI_FORMAT);
163
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
164
+ DPI_ORDER);
165
+ break;
166
+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
167
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
168
+ DPI_FORMAT);
169
+ break;
170
+ case MEDIA_BUS_FMT_RGB666_1X18:
171
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
172
+ DPI_FORMAT);
173
+ break;
174
+ case MEDIA_BUS_FMT_RGB565_1X16:
175
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_1,
176
+ DPI_FORMAT);
177
+ break;
178
+ default:
179
+ DRM_ERROR("Unknown media bus format %d\n",
180
+ bus_format);
181
+ break;
182
+ }
217183 }
184
+
185
+ if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
186
+ dpi_c |= DPI_PIXEL_CLK_INVERT;
187
+
188
+ if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
189
+ dpi_c |= DPI_OUTPUT_ENABLE_INVERT;
218190 } else {
219191 /* Default to 24bit if no connector found. */
220192 dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB, DPI_FORMAT);
....@@ -284,9 +256,10 @@
284256 }
285257
286258 if (panel)
287
- bridge = drm_panel_bridge_add(panel, DRM_MODE_CONNECTOR_DPI);
259
+ bridge = drm_panel_bridge_add_typed(panel,
260
+ DRM_MODE_CONNECTOR_DPI);
288261
289
- return drm_bridge_attach(dpi->encoder, bridge, NULL);
262
+ return drm_bridge_attach(dpi->encoder, bridge, NULL, 0);
290263 }
291264
292265 static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)
....@@ -314,6 +287,9 @@
314287 dpi->regs = vc4_ioremap_regs(pdev, 0);
315288 if (IS_ERR(dpi->regs))
316289 return PTR_ERR(dpi->regs);
290
+ dpi->regset.base = dpi->regs;
291
+ dpi->regset.regs = dpi_regs;
292
+ dpi->regset.nregs = ARRAY_SIZE(dpi_regs);
317293
318294 if (DPI_READ(DPI_ID) != DPI_ID_VALUE) {
319295 dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
....@@ -340,8 +316,7 @@
340316 if (ret)
341317 DRM_ERROR("Failed to turn on core clock: %d\n", ret);
342318
343
- drm_encoder_init(drm, dpi->encoder, &vc4_dpi_encoder_funcs,
344
- DRM_MODE_ENCODER_DPI, NULL);
319
+ drm_simple_encoder_init(drm, dpi->encoder, DRM_MODE_ENCODER_DPI);
345320 drm_encoder_helper_add(dpi->encoder, &vc4_dpi_encoder_helper_funcs);
346321
347322 ret = vc4_dpi_init_bridge(dpi);
....@@ -352,6 +327,8 @@
352327
353328 vc4->dpi = dpi;
354329
330
+ vc4_debugfs_add_regset32(drm, "dpi_regs", &dpi->regset);
331
+
355332 return 0;
356333
357334 err_destroy_encoder: