Linux Audio

Check our new training course

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