162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * Copyright 2019,2020,2022 NXP 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef __IMX_LDB_HELPER__ 862306a36Sopenharmony_ci#define __IMX_LDB_HELPER__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/device.h> 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci#include <linux/of.h> 1362306a36Sopenharmony_ci#include <linux/regmap.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <drm/drm_atomic.h> 1662306a36Sopenharmony_ci#include <drm/drm_bridge.h> 1762306a36Sopenharmony_ci#include <drm/drm_device.h> 1862306a36Sopenharmony_ci#include <drm/drm_encoder.h> 1962306a36Sopenharmony_ci#include <drm/drm_modeset_helper_vtables.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define LDB_CH0_MODE_EN_TO_DI0 BIT(0) 2262306a36Sopenharmony_ci#define LDB_CH0_MODE_EN_TO_DI1 (3 << 0) 2362306a36Sopenharmony_ci#define LDB_CH0_MODE_EN_MASK (3 << 0) 2462306a36Sopenharmony_ci#define LDB_CH1_MODE_EN_TO_DI0 BIT(2) 2562306a36Sopenharmony_ci#define LDB_CH1_MODE_EN_TO_DI1 (3 << 2) 2662306a36Sopenharmony_ci#define LDB_CH1_MODE_EN_MASK (3 << 2) 2762306a36Sopenharmony_ci#define LDB_SPLIT_MODE_EN BIT(4) 2862306a36Sopenharmony_ci#define LDB_DATA_WIDTH_CH0_24 BIT(5) 2962306a36Sopenharmony_ci#define LDB_BIT_MAP_CH0_JEIDA BIT(6) 3062306a36Sopenharmony_ci#define LDB_DATA_WIDTH_CH1_24 BIT(7) 3162306a36Sopenharmony_ci#define LDB_BIT_MAP_CH1_JEIDA BIT(8) 3262306a36Sopenharmony_ci#define LDB_DI0_VS_POL_ACT_LOW BIT(9) 3362306a36Sopenharmony_ci#define LDB_DI1_VS_POL_ACT_LOW BIT(10) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define MAX_LDB_CHAN_NUM 2 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cienum ldb_channel_link_type { 3862306a36Sopenharmony_ci LDB_CH_SINGLE_LINK, 3962306a36Sopenharmony_ci LDB_CH_DUAL_LINK_EVEN_ODD_PIXELS, 4062306a36Sopenharmony_ci LDB_CH_DUAL_LINK_ODD_EVEN_PIXELS, 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct ldb; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct ldb_channel { 4662306a36Sopenharmony_ci struct ldb *ldb; 4762306a36Sopenharmony_ci struct drm_bridge bridge; 4862306a36Sopenharmony_ci struct drm_bridge *next_bridge; 4962306a36Sopenharmony_ci struct device_node *np; 5062306a36Sopenharmony_ci u32 chno; 5162306a36Sopenharmony_ci bool is_available; 5262306a36Sopenharmony_ci u32 in_bus_format; 5362306a36Sopenharmony_ci u32 out_bus_format; 5462306a36Sopenharmony_ci enum ldb_channel_link_type link_type; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct ldb { 5862306a36Sopenharmony_ci struct regmap *regmap; 5962306a36Sopenharmony_ci struct device *dev; 6062306a36Sopenharmony_ci struct ldb_channel *channel[MAX_LDB_CHAN_NUM]; 6162306a36Sopenharmony_ci unsigned int ctrl_reg; 6262306a36Sopenharmony_ci u32 ldb_ctrl; 6362306a36Sopenharmony_ci unsigned int available_ch_cnt; 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define bridge_to_ldb_ch(b) container_of(b, struct ldb_channel, bridge) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cibool ldb_channel_is_single_link(struct ldb_channel *ldb_ch); 6962306a36Sopenharmony_cibool ldb_channel_is_split_link(struct ldb_channel *ldb_ch); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciint ldb_bridge_atomic_check_helper(struct drm_bridge *bridge, 7262306a36Sopenharmony_ci struct drm_bridge_state *bridge_state, 7362306a36Sopenharmony_ci struct drm_crtc_state *crtc_state, 7462306a36Sopenharmony_ci struct drm_connector_state *conn_state); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_civoid ldb_bridge_mode_set_helper(struct drm_bridge *bridge, 7762306a36Sopenharmony_ci const struct drm_display_mode *mode, 7862306a36Sopenharmony_ci const struct drm_display_mode *adjusted_mode); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_civoid ldb_bridge_enable_helper(struct drm_bridge *bridge); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_civoid ldb_bridge_disable_helper(struct drm_bridge *bridge); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciint ldb_bridge_attach_helper(struct drm_bridge *bridge, 8562306a36Sopenharmony_ci enum drm_bridge_attach_flags flags); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciint ldb_init_helper(struct ldb *ldb); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciint ldb_find_next_bridge_helper(struct ldb *ldb); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_civoid ldb_add_bridge_helper(struct ldb *ldb, 9262306a36Sopenharmony_ci const struct drm_bridge_funcs *bridge_funcs); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_civoid ldb_remove_bridge_helper(struct ldb *ldb); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#endif /* __IMX_LDB_HELPER__ */ 97