xref: /openbmc/linux/drivers/gpu/drm/bridge/imx/imx-ldb-helper.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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