/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright 2019,2020,2022 NXP */ #ifndef __IMX_LDB_HELPER__ #define __IMX_LDB_HELPER__ #include #include #include #include #include #include #include #include #include #define LDB_CH0_MODE_EN_TO_DI0 BIT(0) #define LDB_CH0_MODE_EN_TO_DI1 (3 << 0) #define LDB_CH0_MODE_EN_MASK (3 << 0) #define LDB_CH1_MODE_EN_TO_DI0 BIT(2) #define LDB_CH1_MODE_EN_TO_DI1 (3 << 2) #define LDB_CH1_MODE_EN_MASK (3 << 2) #define LDB_SPLIT_MODE_EN BIT(4) #define LDB_DATA_WIDTH_CH0_24 BIT(5) #define LDB_BIT_MAP_CH0_JEIDA BIT(6) #define LDB_DATA_WIDTH_CH1_24 BIT(7) #define LDB_BIT_MAP_CH1_JEIDA BIT(8) #define LDB_DI0_VS_POL_ACT_LOW BIT(9) #define LDB_DI1_VS_POL_ACT_LOW BIT(10) #define MAX_LDB_CHAN_NUM 2 enum ldb_channel_link_type { LDB_CH_SINGLE_LINK, LDB_CH_DUAL_LINK_EVEN_ODD_PIXELS, LDB_CH_DUAL_LINK_ODD_EVEN_PIXELS, }; struct ldb; struct ldb_channel { struct ldb *ldb; struct drm_bridge bridge; struct drm_bridge *next_bridge; struct device_node *np; u32 chno; bool is_available; u32 in_bus_format; u32 out_bus_format; enum ldb_channel_link_type link_type; }; struct ldb { struct regmap *regmap; struct device *dev; struct ldb_channel *channel[MAX_LDB_CHAN_NUM]; unsigned int ctrl_reg; u32 ldb_ctrl; unsigned int available_ch_cnt; }; #define bridge_to_ldb_ch(b) container_of(b, struct ldb_channel, bridge) bool ldb_channel_is_single_link(struct ldb_channel *ldb_ch); bool ldb_channel_is_split_link(struct ldb_channel *ldb_ch); int ldb_bridge_atomic_check_helper(struct drm_bridge *bridge, struct drm_bridge_state *bridge_state, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state); void ldb_bridge_mode_set_helper(struct drm_bridge *bridge, const struct drm_display_mode *mode, const struct drm_display_mode *adjusted_mode); void ldb_bridge_enable_helper(struct drm_bridge *bridge); void ldb_bridge_disable_helper(struct drm_bridge *bridge); int ldb_bridge_attach_helper(struct drm_bridge *bridge, enum drm_bridge_attach_flags flags); int ldb_init_helper(struct ldb *ldb); int ldb_find_next_bridge_helper(struct ldb *ldb); void ldb_add_bridge_helper(struct ldb *ldb, const struct drm_bridge_funcs *bridge_funcs); void ldb_remove_bridge_helper(struct ldb *ldb); #endif /* __IMX_LDB_HELPER__ */