Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/gpu/drm/bridge/imx/imx-ldb-helper.h
26517 views
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
37
enum 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
43
struct ldb;
44
45
struct 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
57
struct 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
68
bool ldb_channel_is_single_link(struct ldb_channel *ldb_ch);
69
bool ldb_channel_is_split_link(struct ldb_channel *ldb_ch);
70
71
int 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
76
void 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
80
void ldb_bridge_enable_helper(struct drm_bridge *bridge);
81
82
void ldb_bridge_disable_helper(struct drm_bridge *bridge);
83
84
int ldb_bridge_attach_helper(struct drm_bridge *bridge, struct drm_encoder *encoder,
85
enum drm_bridge_attach_flags flags);
86
87
int ldb_init_helper(struct ldb *ldb);
88
89
int ldb_find_next_bridge_helper(struct ldb *ldb);
90
91
void ldb_add_bridge_helper(struct ldb *ldb);
92
93
void ldb_remove_bridge_helper(struct ldb *ldb);
94
95
#endif /* __IMX_LDB_HELPER__ */
96
97