1*1039fb60SLiu Ying /* SPDX-License-Identifier: GPL-2.0+ */ 2*1039fb60SLiu Ying 3*1039fb60SLiu Ying /* 4*1039fb60SLiu Ying * Copyright 2019,2020,2022 NXP 5*1039fb60SLiu Ying */ 6*1039fb60SLiu Ying 7*1039fb60SLiu Ying #ifndef __IMX_LDB_HELPER__ 8*1039fb60SLiu Ying #define __IMX_LDB_HELPER__ 9*1039fb60SLiu Ying 10*1039fb60SLiu Ying #include <linux/device.h> 11*1039fb60SLiu Ying #include <linux/kernel.h> 12*1039fb60SLiu Ying #include <linux/of.h> 13*1039fb60SLiu Ying #include <linux/regmap.h> 14*1039fb60SLiu Ying 15*1039fb60SLiu Ying #include <drm/drm_atomic.h> 16*1039fb60SLiu Ying #include <drm/drm_bridge.h> 17*1039fb60SLiu Ying #include <drm/drm_device.h> 18*1039fb60SLiu Ying #include <drm/drm_encoder.h> 19*1039fb60SLiu Ying #include <drm/drm_modeset_helper_vtables.h> 20*1039fb60SLiu Ying 21*1039fb60SLiu Ying #define LDB_CH0_MODE_EN_TO_DI0 BIT(0) 22*1039fb60SLiu Ying #define LDB_CH0_MODE_EN_TO_DI1 (3 << 0) 23*1039fb60SLiu Ying #define LDB_CH0_MODE_EN_MASK (3 << 0) 24*1039fb60SLiu Ying #define LDB_CH1_MODE_EN_TO_DI0 BIT(2) 25*1039fb60SLiu Ying #define LDB_CH1_MODE_EN_TO_DI1 (3 << 2) 26*1039fb60SLiu Ying #define LDB_CH1_MODE_EN_MASK (3 << 2) 27*1039fb60SLiu Ying #define LDB_SPLIT_MODE_EN BIT(4) 28*1039fb60SLiu Ying #define LDB_DATA_WIDTH_CH0_24 BIT(5) 29*1039fb60SLiu Ying #define LDB_BIT_MAP_CH0_JEIDA BIT(6) 30*1039fb60SLiu Ying #define LDB_DATA_WIDTH_CH1_24 BIT(7) 31*1039fb60SLiu Ying #define LDB_BIT_MAP_CH1_JEIDA BIT(8) 32*1039fb60SLiu Ying #define LDB_DI0_VS_POL_ACT_LOW BIT(9) 33*1039fb60SLiu Ying #define LDB_DI1_VS_POL_ACT_LOW BIT(10) 34*1039fb60SLiu Ying 35*1039fb60SLiu Ying #define MAX_LDB_CHAN_NUM 2 36*1039fb60SLiu Ying 37*1039fb60SLiu Ying enum ldb_channel_link_type { 38*1039fb60SLiu Ying LDB_CH_SINGLE_LINK, 39*1039fb60SLiu Ying LDB_CH_DUAL_LINK_EVEN_ODD_PIXELS, 40*1039fb60SLiu Ying LDB_CH_DUAL_LINK_ODD_EVEN_PIXELS, 41*1039fb60SLiu Ying }; 42*1039fb60SLiu Ying 43*1039fb60SLiu Ying struct ldb; 44*1039fb60SLiu Ying 45*1039fb60SLiu Ying struct ldb_channel { 46*1039fb60SLiu Ying struct ldb *ldb; 47*1039fb60SLiu Ying struct drm_bridge bridge; 48*1039fb60SLiu Ying struct drm_bridge *next_bridge; 49*1039fb60SLiu Ying struct device_node *np; 50*1039fb60SLiu Ying u32 chno; 51*1039fb60SLiu Ying bool is_available; 52*1039fb60SLiu Ying u32 in_bus_format; 53*1039fb60SLiu Ying u32 out_bus_format; 54*1039fb60SLiu Ying enum ldb_channel_link_type link_type; 55*1039fb60SLiu Ying }; 56*1039fb60SLiu Ying 57*1039fb60SLiu Ying struct ldb { 58*1039fb60SLiu Ying struct regmap *regmap; 59*1039fb60SLiu Ying struct device *dev; 60*1039fb60SLiu Ying struct ldb_channel *channel[MAX_LDB_CHAN_NUM]; 61*1039fb60SLiu Ying unsigned int ctrl_reg; 62*1039fb60SLiu Ying u32 ldb_ctrl; 63*1039fb60SLiu Ying unsigned int available_ch_cnt; 64*1039fb60SLiu Ying }; 65*1039fb60SLiu Ying 66*1039fb60SLiu Ying #define bridge_to_ldb_ch(b) container_of(b, struct ldb_channel, bridge) 67*1039fb60SLiu Ying 68*1039fb60SLiu Ying bool ldb_channel_is_single_link(struct ldb_channel *ldb_ch); 69*1039fb60SLiu Ying bool ldb_channel_is_split_link(struct ldb_channel *ldb_ch); 70*1039fb60SLiu Ying 71*1039fb60SLiu Ying int ldb_bridge_atomic_check_helper(struct drm_bridge *bridge, 72*1039fb60SLiu Ying struct drm_bridge_state *bridge_state, 73*1039fb60SLiu Ying struct drm_crtc_state *crtc_state, 74*1039fb60SLiu Ying struct drm_connector_state *conn_state); 75*1039fb60SLiu Ying 76*1039fb60SLiu Ying void ldb_bridge_mode_set_helper(struct drm_bridge *bridge, 77*1039fb60SLiu Ying const struct drm_display_mode *mode, 78*1039fb60SLiu Ying const struct drm_display_mode *adjusted_mode); 79*1039fb60SLiu Ying 80*1039fb60SLiu Ying void ldb_bridge_enable_helper(struct drm_bridge *bridge); 81*1039fb60SLiu Ying 82*1039fb60SLiu Ying void ldb_bridge_disable_helper(struct drm_bridge *bridge); 83*1039fb60SLiu Ying 84*1039fb60SLiu Ying int ldb_bridge_attach_helper(struct drm_bridge *bridge, 85*1039fb60SLiu Ying enum drm_bridge_attach_flags flags); 86*1039fb60SLiu Ying 87*1039fb60SLiu Ying int ldb_init_helper(struct ldb *ldb); 88*1039fb60SLiu Ying 89*1039fb60SLiu Ying int ldb_find_next_bridge_helper(struct ldb *ldb); 90*1039fb60SLiu Ying 91*1039fb60SLiu Ying void ldb_add_bridge_helper(struct ldb *ldb, 92*1039fb60SLiu Ying const struct drm_bridge_funcs *bridge_funcs); 93*1039fb60SLiu Ying 94*1039fb60SLiu Ying void ldb_remove_bridge_helper(struct ldb *ldb); 95*1039fb60SLiu Ying 96*1039fb60SLiu Ying #endif /* __IMX_LDB_HELPER__ */ 97