mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

The drm_bridge structure contains an encoder pointer that is widely used by bridge drivers. This pattern is largely documented as deprecated in other KMS entities for atomic drivers. However, one of the main use of that pointer is done in attach to just call drm_bridge_attach on the next bridge to add it to the bridge list. While this dereferences the bridge->encoder pointer, it's effectively the same encoder the bridge was being attached to. We can make it more explicit by adding the encoder the bridge is attached to to the list of attach parameters. This also removes the need to dereference bridge->encoder in most drivers. Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Douglas Anderson <dianders@chromium.org> Tested-by: Douglas Anderson <dianders@chromium.org> Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250313-bridge-connector-v6-1-511c54a604fb@kernel.org Signed-off-by: Maxime Ripard <mripard@kernel.org>
97 lines
2.5 KiB
C
97 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
|
|
/*
|
|
* Copyright 2019,2020,2022 NXP
|
|
*/
|
|
|
|
#ifndef __IMX_LDB_HELPER__
|
|
#define __IMX_LDB_HELPER__
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/of.h>
|
|
#include <linux/regmap.h>
|
|
|
|
#include <drm/drm_atomic.h>
|
|
#include <drm/drm_bridge.h>
|
|
#include <drm/drm_device.h>
|
|
#include <drm/drm_encoder.h>
|
|
#include <drm/drm_modeset_helper_vtables.h>
|
|
|
|
#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, struct drm_encoder *encoder,
|
|
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__ */
|