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