xref: /rk3399_rockchip-uboot/drivers/video/drm/display-serdes/core.h (revision a4719b90cc2f09e5348b830d61f32ab6d991069a)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * core.h -- core define for mfd display arch
4  *
5  * Copyright (c) 2023-2028 Rockchip Electronics Co. Ltd.
6  *
7  * Author: luowei <lw@rock-chips.com>
8  *
9  */
10 #include <common.h>
11 #include <dm.h>
12 #include <i2c.h>
13 #include <errno.h>
14 #include <drm/drm_mipi_dsi.h>
15 #include <drm/drm_dsc.h>
16 #include <drm_modes.h>
17 #include <video_bridge.h>
18 #include <asm/unaligned.h>
19 #include <linux/media-bus-format.h>
20 #include <linux/bitfield.h>
21 #include <linux/iopoll.h>
22 #include <power/regulator.h>
23 #include <config.h>
24 #include <backlight.h>
25 #include <malloc.h>
26 #include <video.h>
27 
28 #include <asm/gpio.h>
29 #include <dm/device.h>
30 #include <dm/read.h>
31 #include <dm/pinctrl.h>
32 #include <dm/uclass-id.h>
33 #include <dm/lists.h>
34 
35 #include <dm/device-internal.h>
36 #include <dm/root.h>
37 #include <fdtdec.h>
38 #include <regmap.h>
39 #include <asm/gpio.h>
40 #include <asm/system.h>
41 #include <asm/io.h>
42 
43 #include "gpio.h"
44 
45 #include "../drivers/video/drm/rockchip_bridge.h"
46 #include "../drivers/video/drm/rockchip_display.h"
47 #include "../drivers/video/drm/rockchip_panel.h"
48 
49 #ifndef __SERDES_DISPLAY_CORE_H__
50 #define __SERDES_DISPLAY_CORE_H__
51 
52 //#define SERDES_DEBUG_MFD
53 //#define SERDES_DEBUG_I2C
54 //#define SERDES_DEBUG_CHIP
55 
56 #ifdef SERDES_DEBUG_MFD
57 #define  SERDES_DBG_MFD(x...) printf(x)
58 #else
59 #define  SERDES_DBG_MFD(x...)
60 #endif
61 
62 #ifdef SERDES_DEBUG_I2C
63 #define  SERDES_DBG_I2C(x...) printf(x)
64 #else
65 #define  SERDES_DBG_I2C(x...)
66 #endif
67 
68 #ifdef SERDES_DEBUG_CHIP
69 #define  SERDES_DBG_CHIP(x...) printf(x)
70 #else
71 #define  SERDES_DBG_CHIP(x...)
72 #endif
73 
74 #define SERDES_UBOOT_DISPLAY_VERSION "serdes-uboot-displaly-v10-230920"
75 #define MAX_NUM_SERDES_SPLIT 8
76 struct serdes;
77 
78 enum ser_link_mode {
79 	SER_DUAL_LINK,
80 	SER_LINKA,
81 	SER_LINKB,
82 	SER_SPLITTER_MODE,
83 };
84 
85 /* Convenience macro to define a single named or anonymous pin descriptor */
86 #define PINCTRL_PIN(a, b) { .number = a, .name = b }
87 
88 /**
89  * struct pinctrl_pin_desc - boards/machines provide information on their
90  * pins, pads or other muxable units in this struct
91  * @number: unique pin number from the global pin number space
92  * @name: a name for this pin
93  * @drv_data: driver-defined per-pin data. pinctrl core does not touch this
94  */
95 struct pinctrl_pin_desc {
96 	unsigned int number;
97 	const char *name;
98 	void *drv_data;
99 };
100 
101 /**
102  * struct group_desc - generic pin group descriptor
103  * @name: name of the pin group
104  * @pins: array of pins that belong to the group
105  * @num_pins: number of pins in the group
106  * @data: pin controller driver specific data
107  */
108 struct group_desc {
109 	const char *name;
110 	int *pins;
111 	int num_pins;
112 	void *data;
113 };
114 
115 /**
116  * struct function_desc - generic function descriptor
117  * @name: name of the function
118  * @group_names: array of pin group names
119  * @num_group_names: number of pin group names
120  * @data: pin controller driver specific data
121  */
122 struct function_desc {
123 	const char *name;
124 	const char **group_names;
125 	int num_group_names;
126 	void *data;
127 };
128 
129 struct serdes_chip_pinctrl_info {
130 	struct pinctrl_pin_desc *pins;
131 	unsigned int num_pins;
132 	struct group_desc *groups;
133 	unsigned int num_groups;
134 	struct function_desc *functions;
135 	unsigned int num_functions;
136 };
137 
138 struct serdes_chip_bridge_ops {
139 	/*serdes chip function for bridge*/
140 	int (*power_on)(struct serdes *serdes);
141 	int (*init)(struct serdes *serdes);
142 	int (*attach)(struct serdes *serdes);
143 	bool (*detect)(struct serdes *serdes);
144 	int (*get_modes)(struct serdes *serdes);
145 	int (*pre_enable)(struct serdes *serdes);
146 	int (*enable)(struct serdes *serdes);
147 	int (*disable)(struct serdes *serdes);
148 	int (*post_disable)(struct serdes *serdes);
149 };
150 
151 struct serdes_chip_panel_ops {
152 	/*serdes chip function for bridge*/
153 	int (*power_on)(struct serdes *serdes);
154 	int (*init)(struct serdes *serdes);
155 	int (*disable)(struct serdes *serdes);
156 	int (*unprepare)(struct serdes *serdes);
157 	int (*prepare)(struct serdes *serdes);
158 	int (*enable)(struct serdes *serdes);
159 	int (*get_modes)(struct serdes *serdes);
160 	int (*mode_set)(struct serdes *serdes);
161 	int (*backlight_enable)(struct serdes *serdes);
162 	int (*backlight_disable)(struct serdes *serdes);
163 };
164 
165 struct serdes_chip_pinctrl_ops {
166 	int (*pinmux_set)(struct serdes *serdes, unsigned int pin_selector,
167 			  unsigned int func_selector);
168 	int (*pinmux_group_set)(struct serdes *serdes,
169 				unsigned int group_selector,
170 				unsigned int func_selector);
171 	int (*pinconf_set)(struct serdes *serdes,
172 			   unsigned int pin_selector,
173 			   unsigned int param, unsigned int argument);
174 	int (*pinconf_group_set)(struct serdes *serdes,
175 				 unsigned int group_selector,
176 				 unsigned int param, unsigned int argument);
177 };
178 
179 struct serdes_chip_gpio_ops {
180 	/*serdes chip gpio function*/
181 	int (*direction_input)(struct serdes *serdes, int gpio);
182 	int (*direction_output)(struct serdes *serdes, int gpio, int value);
183 	int (*get_level)(struct serdes *serdes, int gpio);
184 	int (*set_level)(struct serdes *serdes, int gpio, int value);
185 	int (*set_config)(struct serdes *serdes,
186 			  int gpio, unsigned long config);
187 	int (*to_irq)(struct serdes *serdes, int gpio);
188 };
189 
190 struct serdes_chip_split_ops {
191 	int (*select)(struct serdes *serdes, int chan);
192 	int (*deselect)(struct serdes *serdes, int chan);
193 	int (*set_i2c_addr)(struct serdes *serdes, int address, int link);
194 };
195 struct serdes_chip_irq_ops {
196 	/*serdes chip function for lock and err irq*/
197 	int (*lock_handle)(struct serdes *serdes);
198 	int (*err_handle)(struct serdes *serdes);
199 };
200 
201 struct serdes_chip_data {
202 	const char *name;
203 	enum serdes_type serdes_type;
204 	enum serdes_id serdes_id;
205 	enum reg_val_type reg_val_type;
206 	int sequence_init;
207 	int connector_type;
208 	int reg_id;
209 	int id_data;
210 	int int_status_reg;
211 	int int_trig;
212 	int num_gpio;
213 	int gpio_base;
214 	int same_chip_count;
215 	u8 bank_num;
216 
217 	int (*chip_init)(struct serdes *serdes);
218 	struct serdes_chip_pinctrl_info *pinctrl_info;
219 	struct serdes_chip_bridge_ops *bridge_ops;
220 	struct serdes_chip_panel_ops *panel_ops;
221 	struct serdes_chip_pinctrl_ops *pinctrl_ops;
222 	struct serdes_chip_gpio_ops *gpio_ops;
223 	struct serdes_chip_split_ops *split_ops;
224 	struct serdes_chip_irq_ops *irq_ops;
225 };
226 
227 struct reg_sequence {
228 	unsigned int reg;
229 	unsigned int def;
230 	unsigned int delay_us;
231 };
232 
233 struct serdes_init_seq {
234 	struct reg_sequence *reg_sequence;
235 	unsigned int reg_seq_cnt;
236 };
237 
238 struct serdes_gpio {
239 	struct udevice *dev;
240 	struct serdes_pinctrl *parent;
241 };
242 
243 struct serdes_pinctrl {
244 	struct udevice *dev;
245 	struct serdes *parent;
246 	struct serdes_gpio *serdes_gpio;
247 	struct pinctrl_pin_desc *pdesc;
248 	struct regmap *regmap;
249 	struct pinctrl_desc *pinctrl_desc;
250 	int pin_base;
251 };
252 
253 struct serdes_panel {
254 	struct rockchip_panel *panel;
255 	const char *name;
256 	u32 width_mm;
257 	u32 height_mm;
258 	u32 link_rate;
259 	u32 lane_count;
260 	bool ssc;
261 	struct serdes *parent;
262 	struct drm_display_mode mode;
263 	struct udevice *backlight;
264 	struct rockchip_panel_funcs *panel_ops;
265 };
266 
267 struct serdes_panel_split {
268 	struct rockchip_panel *panel;
269 
270 	const char *name;
271 	u32 width_mm;
272 	u32 height_mm;
273 	u32 link_rate;
274 	u32 lane_count;
275 	bool ssc;
276 	struct serdes *parent;
277 	struct drm_display_mode mode;
278 	struct udevice *backlight;
279 	struct rockchip_panel_funcs *panel_ops;
280 };
281 
282 struct serdes_bridge {
283 	bool sel_mipi;
284 	struct mipi_dsi_device *dsi;
285 	struct serdes *parent;
286 	struct drm_display_mode mode;
287 	struct rockchip_bridge *bridge;
288 	struct rockchip_bridge_funcs *bridge_ops;
289 };
290 
291 struct serdes_bridge_split {
292 	bool sel_mipi;
293 	struct mipi_dsi_device *dsi;
294 	struct serdes *parent;
295 	struct drm_display_mode mode;
296 	struct rockchip_bridge *bridge;
297 	struct rockchip_bridge_funcs *bridge_ops;
298 };
299 
300 struct serdes {
301 	struct udevice *dev;
302 	struct udevice *vpower_supply;
303 	struct serdes_init_seq *serdes_init_seq;
304 	enum serdes_type type;
305 
306 	/*serdes power and reset pin*/
307 	struct gpio_desc reset_gpio;
308 	struct gpio_desc enable_gpio;
309 
310 	/* serdes irq pin */
311 	struct gpio_desc lock_gpio;
312 	struct gpio_desc err_gpio;
313 	int lock_irq;
314 	int err_irq;
315 	int lock_irq_trig;
316 	int err_irq_trig;
317 
318 	bool sel_mipi;
319 	struct mipi_dsi_device *dsi;
320 
321 	bool split_mode_enable;
322 	unsigned int reg_hw;
323 	unsigned int reg_use;
324 	unsigned int link_use;
325 	unsigned int id_serdes_bridge_split;
326 	unsigned int id_serdes_panel_split;
327 	struct serdes *g_serdes_bridge_split;
328 
329 	struct serdes_bridge *serdes_bridge;
330 	struct serdes_bridge_split *serdes_bridge_split;
331 	struct serdes_panel *serdes_panel;
332 	struct serdes_panel_split *serdes_panel_split;
333 	struct serdes_pinctrl *serdes_pinctrl;
334 	struct serdes_chip_data *chip_data;
335 };
336 
337 /* Device I/O API */
338 int serdes_reg_read(struct serdes *serdes, unsigned int reg, unsigned int *val);
339 int serdes_reg_write(struct serdes *serdes, unsigned int reg, unsigned int val);
340 int serdes_set_bits(struct serdes *serdes, unsigned int reg,
341 		    unsigned int mask, unsigned int val);
342 int serdes_multi_reg_write(struct serdes *serdes,
343 			   const struct reg_sequence *regs,
344 			   int num_regs);
345 int serdes_i2c_set_sequence(struct serdes *serdes);
346 int serdes_parse_init_seq(struct udevice *dev, const u16 *data,
347 			  int length, struct serdes_init_seq *seq);
348 int serdes_get_init_seq(struct serdes *serdes);
349 int serdes_gpio_register(struct udevice *dev, struct serdes *serdes);
350 int serdes_pinctrl_register(struct udevice *dev, struct serdes *serdes);
351 int serdes_bridge_register(struct udevice *dev, struct serdes *serdes);
352 int serdes_bridge_split_register(struct udevice *dev, struct serdes *serdes);
353 int serdes_power_init(void);
354 int serdes_video_bridge_init(void);
355 int serdes_video_bridge_split_init(void);
356 int serdes_display_init(void);
357 
358 extern struct serdes_chip_data serdes_bu18tl82_data;
359 extern struct serdes_chip_data serdes_bu18rl82_data;
360 extern struct serdes_chip_data serdes_max96745_data;
361 extern struct serdes_chip_data serdes_max96752_data;
362 extern struct serdes_chip_data serdes_max96755_data;
363 extern struct serdes_chip_data serdes_max96772_data;
364 extern struct serdes_chip_data serdes_max96789_data;
365 extern struct serdes_chip_data serdes_rkx111_data;
366 extern struct serdes_chip_data serdes_rkx121_data;
367 extern struct serdes_chip_data serdes_nca9539_data;
368 
369 #endif
370