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, int link); 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 bool mcu_enable; 320 struct mipi_dsi_device *dsi; 321 322 bool split_mode_enable; 323 unsigned int reg_hw; 324 unsigned int reg_use; 325 unsigned int link_use; 326 unsigned int id_serdes_bridge_split; 327 unsigned int id_serdes_panel_split; 328 struct serdes *g_serdes_bridge_split; 329 330 struct serdes_bridge *serdes_bridge; 331 struct serdes_bridge_split *serdes_bridge_split; 332 struct serdes_panel *serdes_panel; 333 struct serdes_panel_split *serdes_panel_split; 334 struct serdes_pinctrl *serdes_pinctrl; 335 struct serdes_chip_data *chip_data; 336 }; 337 338 /* Device I/O API */ 339 int serdes_reg_read(struct serdes *serdes, unsigned int reg, unsigned int *val); 340 int serdes_reg_write(struct serdes *serdes, unsigned int reg, unsigned int val); 341 int serdes_set_bits(struct serdes *serdes, unsigned int reg, 342 unsigned int mask, unsigned int val); 343 int serdes_multi_reg_write(struct serdes *serdes, 344 const struct reg_sequence *regs, 345 int num_regs); 346 int serdes_i2c_set_sequence(struct serdes *serdes); 347 int serdes_parse_init_seq(struct udevice *dev, const u16 *data, 348 int length, struct serdes_init_seq *seq); 349 int serdes_get_init_seq(struct serdes *serdes); 350 int serdes_gpio_register(struct udevice *dev); 351 int serdes_pinctrl_register(struct udevice *dev); 352 int serdes_bridge_register(struct udevice *dev, struct serdes *serdes); 353 int serdes_bridge_split_register(struct udevice *dev, struct serdes *serdes); 354 int serdes_power_init(void); 355 int serdes_video_bridge_init(void); 356 int serdes_video_bridge_split_init(void); 357 int serdes_display_init(void); 358 359 extern struct serdes_chip_data serdes_bu18tl82_data; 360 extern struct serdes_chip_data serdes_bu18rl82_data; 361 extern struct serdes_chip_data serdes_max96745_data; 362 extern struct serdes_chip_data serdes_max96752_data; 363 extern struct serdes_chip_data serdes_max96755_data; 364 extern struct serdes_chip_data serdes_max96772_data; 365 extern struct serdes_chip_data serdes_max96789_data; 366 extern struct serdes_chip_data serdes_rkx111_data; 367 extern struct serdes_chip_data serdes_rkx121_data; 368 extern struct serdes_chip_data serdes_nca9539_data; 369 370 #endif 371