18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2015, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef __DSI_CONNECTOR_H__ 78c2ecf20Sopenharmony_ci#define __DSI_CONNECTOR_H__ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 108c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <drm/drm_bridge.h> 138c2ecf20Sopenharmony_ci#include <drm/drm_crtc.h> 148c2ecf20Sopenharmony_ci#include <drm/drm_mipi_dsi.h> 158c2ecf20Sopenharmony_ci#include <drm/drm_panel.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include "msm_drv.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#define DSI_0 0 208c2ecf20Sopenharmony_ci#define DSI_1 1 218c2ecf20Sopenharmony_ci#define DSI_MAX 2 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct msm_dsi_phy_shared_timings; 248c2ecf20Sopenharmony_cistruct msm_dsi_phy_clk_request; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cienum msm_dsi_phy_type { 278c2ecf20Sopenharmony_ci MSM_DSI_PHY_28NM_HPM, 288c2ecf20Sopenharmony_ci MSM_DSI_PHY_28NM_LP, 298c2ecf20Sopenharmony_ci MSM_DSI_PHY_20NM, 308c2ecf20Sopenharmony_ci MSM_DSI_PHY_28NM_8960, 318c2ecf20Sopenharmony_ci MSM_DSI_PHY_14NM, 328c2ecf20Sopenharmony_ci MSM_DSI_PHY_10NM, 338c2ecf20Sopenharmony_ci MSM_DSI_PHY_7NM, 348c2ecf20Sopenharmony_ci MSM_DSI_PHY_7NM_V4_1, 358c2ecf20Sopenharmony_ci MSM_DSI_PHY_MAX 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cienum msm_dsi_phy_usecase { 398c2ecf20Sopenharmony_ci MSM_DSI_PHY_STANDALONE, 408c2ecf20Sopenharmony_ci MSM_DSI_PHY_MASTER, 418c2ecf20Sopenharmony_ci MSM_DSI_PHY_SLAVE, 428c2ecf20Sopenharmony_ci}; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define DSI_DEV_REGULATOR_MAX 8 458c2ecf20Sopenharmony_ci#define DSI_BUS_CLK_MAX 4 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* Regulators for DSI devices */ 488c2ecf20Sopenharmony_cistruct dsi_reg_entry { 498c2ecf20Sopenharmony_ci char name[32]; 508c2ecf20Sopenharmony_ci int enable_load; 518c2ecf20Sopenharmony_ci int disable_load; 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistruct dsi_reg_config { 558c2ecf20Sopenharmony_ci int num; 568c2ecf20Sopenharmony_ci struct dsi_reg_entry regs[DSI_DEV_REGULATOR_MAX]; 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct msm_dsi { 608c2ecf20Sopenharmony_ci struct drm_device *dev; 618c2ecf20Sopenharmony_ci struct platform_device *pdev; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci /* connector managed by us when we're connected to a drm_panel */ 648c2ecf20Sopenharmony_ci struct drm_connector *connector; 658c2ecf20Sopenharmony_ci /* internal dsi bridge attached to MDP interface */ 668c2ecf20Sopenharmony_ci struct drm_bridge *bridge; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci struct mipi_dsi_host *host; 698c2ecf20Sopenharmony_ci struct msm_dsi_phy *phy; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci /* 728c2ecf20Sopenharmony_ci * panel/external_bridge connected to dsi bridge output, only one of the 738c2ecf20Sopenharmony_ci * two can be valid at a time 748c2ecf20Sopenharmony_ci */ 758c2ecf20Sopenharmony_ci struct drm_panel *panel; 768c2ecf20Sopenharmony_ci struct drm_bridge *external_bridge; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci struct device *phy_dev; 798c2ecf20Sopenharmony_ci bool phy_enabled; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci /* the encoder we are hooked to (outside of dsi block) */ 828c2ecf20Sopenharmony_ci struct drm_encoder *encoder; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci int id; 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci/* dsi manager */ 888c2ecf20Sopenharmony_cistruct drm_bridge *msm_dsi_manager_bridge_init(u8 id); 898c2ecf20Sopenharmony_civoid msm_dsi_manager_bridge_destroy(struct drm_bridge *bridge); 908c2ecf20Sopenharmony_cistruct drm_connector *msm_dsi_manager_connector_init(u8 id); 918c2ecf20Sopenharmony_cistruct drm_connector *msm_dsi_manager_ext_bridge_init(u8 id); 928c2ecf20Sopenharmony_ciint msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg); 938c2ecf20Sopenharmony_cibool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len); 948c2ecf20Sopenharmony_civoid msm_dsi_manager_setup_encoder(int id); 958c2ecf20Sopenharmony_ciint msm_dsi_manager_register(struct msm_dsi *msm_dsi); 968c2ecf20Sopenharmony_civoid msm_dsi_manager_unregister(struct msm_dsi *msm_dsi); 978c2ecf20Sopenharmony_cibool msm_dsi_manager_validate_current_config(u8 id); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci/* msm dsi */ 1008c2ecf20Sopenharmony_cistatic inline bool msm_dsi_device_connected(struct msm_dsi *msm_dsi) 1018c2ecf20Sopenharmony_ci{ 1028c2ecf20Sopenharmony_ci return msm_dsi->panel || msm_dsi->external_bridge; 1038c2ecf20Sopenharmony_ci} 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistruct drm_encoder *msm_dsi_get_encoder(struct msm_dsi *msm_dsi); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* dsi pll */ 1088c2ecf20Sopenharmony_cistruct msm_dsi_pll; 1098c2ecf20Sopenharmony_ci#ifdef CONFIG_DRM_MSM_DSI_PLL 1108c2ecf20Sopenharmony_cistruct msm_dsi_pll *msm_dsi_pll_init(struct platform_device *pdev, 1118c2ecf20Sopenharmony_ci enum msm_dsi_phy_type type, int dsi_id); 1128c2ecf20Sopenharmony_civoid msm_dsi_pll_destroy(struct msm_dsi_pll *pll); 1138c2ecf20Sopenharmony_ciint msm_dsi_pll_get_clk_provider(struct msm_dsi_pll *pll, 1148c2ecf20Sopenharmony_ci struct clk **byte_clk_provider, struct clk **pixel_clk_provider); 1158c2ecf20Sopenharmony_civoid msm_dsi_pll_save_state(struct msm_dsi_pll *pll); 1168c2ecf20Sopenharmony_ciint msm_dsi_pll_restore_state(struct msm_dsi_pll *pll); 1178c2ecf20Sopenharmony_ciint msm_dsi_pll_set_usecase(struct msm_dsi_pll *pll, 1188c2ecf20Sopenharmony_ci enum msm_dsi_phy_usecase uc); 1198c2ecf20Sopenharmony_ci#else 1208c2ecf20Sopenharmony_cistatic inline struct msm_dsi_pll *msm_dsi_pll_init(struct platform_device *pdev, 1218c2ecf20Sopenharmony_ci enum msm_dsi_phy_type type, int id) { 1228c2ecf20Sopenharmony_ci return ERR_PTR(-ENODEV); 1238c2ecf20Sopenharmony_ci} 1248c2ecf20Sopenharmony_cistatic inline void msm_dsi_pll_destroy(struct msm_dsi_pll *pll) 1258c2ecf20Sopenharmony_ci{ 1268c2ecf20Sopenharmony_ci} 1278c2ecf20Sopenharmony_cistatic inline int msm_dsi_pll_get_clk_provider(struct msm_dsi_pll *pll, 1288c2ecf20Sopenharmony_ci struct clk **byte_clk_provider, struct clk **pixel_clk_provider) 1298c2ecf20Sopenharmony_ci{ 1308c2ecf20Sopenharmony_ci return -ENODEV; 1318c2ecf20Sopenharmony_ci} 1328c2ecf20Sopenharmony_cistatic inline void msm_dsi_pll_save_state(struct msm_dsi_pll *pll) 1338c2ecf20Sopenharmony_ci{ 1348c2ecf20Sopenharmony_ci} 1358c2ecf20Sopenharmony_cistatic inline int msm_dsi_pll_restore_state(struct msm_dsi_pll *pll) 1368c2ecf20Sopenharmony_ci{ 1378c2ecf20Sopenharmony_ci return 0; 1388c2ecf20Sopenharmony_ci} 1398c2ecf20Sopenharmony_cistatic inline int msm_dsi_pll_set_usecase(struct msm_dsi_pll *pll, 1408c2ecf20Sopenharmony_ci enum msm_dsi_phy_usecase uc) 1418c2ecf20Sopenharmony_ci{ 1428c2ecf20Sopenharmony_ci return -ENODEV; 1438c2ecf20Sopenharmony_ci} 1448c2ecf20Sopenharmony_ci#endif 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/* dsi host */ 1478c2ecf20Sopenharmony_cistruct msm_dsi_host; 1488c2ecf20Sopenharmony_ciint msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host, 1498c2ecf20Sopenharmony_ci const struct mipi_dsi_msg *msg); 1508c2ecf20Sopenharmony_civoid msm_dsi_host_xfer_restore(struct mipi_dsi_host *host, 1518c2ecf20Sopenharmony_ci const struct mipi_dsi_msg *msg); 1528c2ecf20Sopenharmony_ciint msm_dsi_host_cmd_tx(struct mipi_dsi_host *host, 1538c2ecf20Sopenharmony_ci const struct mipi_dsi_msg *msg); 1548c2ecf20Sopenharmony_ciint msm_dsi_host_cmd_rx(struct mipi_dsi_host *host, 1558c2ecf20Sopenharmony_ci const struct mipi_dsi_msg *msg); 1568c2ecf20Sopenharmony_civoid msm_dsi_host_cmd_xfer_commit(struct mipi_dsi_host *host, 1578c2ecf20Sopenharmony_ci u32 dma_base, u32 len); 1588c2ecf20Sopenharmony_ciint msm_dsi_host_enable(struct mipi_dsi_host *host); 1598c2ecf20Sopenharmony_ciint msm_dsi_host_disable(struct mipi_dsi_host *host); 1608c2ecf20Sopenharmony_ciint msm_dsi_host_power_on(struct mipi_dsi_host *host, 1618c2ecf20Sopenharmony_ci struct msm_dsi_phy_shared_timings *phy_shared_timings, 1628c2ecf20Sopenharmony_ci bool is_dual_dsi); 1638c2ecf20Sopenharmony_ciint msm_dsi_host_power_off(struct mipi_dsi_host *host); 1648c2ecf20Sopenharmony_ciint msm_dsi_host_set_display_mode(struct mipi_dsi_host *host, 1658c2ecf20Sopenharmony_ci const struct drm_display_mode *mode); 1668c2ecf20Sopenharmony_cistruct drm_panel *msm_dsi_host_get_panel(struct mipi_dsi_host *host); 1678c2ecf20Sopenharmony_ciunsigned long msm_dsi_host_get_mode_flags(struct mipi_dsi_host *host); 1688c2ecf20Sopenharmony_cistruct drm_bridge *msm_dsi_host_get_bridge(struct mipi_dsi_host *host); 1698c2ecf20Sopenharmony_ciint msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer); 1708c2ecf20Sopenharmony_civoid msm_dsi_host_unregister(struct mipi_dsi_host *host); 1718c2ecf20Sopenharmony_ciint msm_dsi_host_set_src_pll(struct mipi_dsi_host *host, 1728c2ecf20Sopenharmony_ci struct msm_dsi_pll *src_pll); 1738c2ecf20Sopenharmony_civoid msm_dsi_host_reset_phy(struct mipi_dsi_host *host); 1748c2ecf20Sopenharmony_civoid msm_dsi_host_get_phy_clk_req(struct mipi_dsi_host *host, 1758c2ecf20Sopenharmony_ci struct msm_dsi_phy_clk_request *clk_req, 1768c2ecf20Sopenharmony_ci bool is_dual_dsi); 1778c2ecf20Sopenharmony_civoid msm_dsi_host_destroy(struct mipi_dsi_host *host); 1788c2ecf20Sopenharmony_ciint msm_dsi_host_modeset_init(struct mipi_dsi_host *host, 1798c2ecf20Sopenharmony_ci struct drm_device *dev); 1808c2ecf20Sopenharmony_ciint msm_dsi_host_init(struct msm_dsi *msm_dsi); 1818c2ecf20Sopenharmony_ciint msm_dsi_runtime_suspend(struct device *dev); 1828c2ecf20Sopenharmony_ciint msm_dsi_runtime_resume(struct device *dev); 1838c2ecf20Sopenharmony_ciint dsi_link_clk_set_rate_6g(struct msm_dsi_host *msm_host); 1848c2ecf20Sopenharmony_ciint dsi_link_clk_set_rate_v2(struct msm_dsi_host *msm_host); 1858c2ecf20Sopenharmony_ciint dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host); 1868c2ecf20Sopenharmony_ciint dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host); 1878c2ecf20Sopenharmony_civoid dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host); 1888c2ecf20Sopenharmony_civoid dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host); 1898c2ecf20Sopenharmony_ciint dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size); 1908c2ecf20Sopenharmony_ciint dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size); 1918c2ecf20Sopenharmony_civoid *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host); 1928c2ecf20Sopenharmony_civoid *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host); 1938c2ecf20Sopenharmony_civoid dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host); 1948c2ecf20Sopenharmony_ciint dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *iova); 1958c2ecf20Sopenharmony_ciint dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *iova); 1968c2ecf20Sopenharmony_ciint dsi_clk_init_v2(struct msm_dsi_host *msm_host); 1978c2ecf20Sopenharmony_ciint dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host); 1988c2ecf20Sopenharmony_ciint dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host, bool is_dual_dsi); 1998c2ecf20Sopenharmony_ciint dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_dual_dsi); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci/* dsi phy */ 2028c2ecf20Sopenharmony_cistruct msm_dsi_phy; 2038c2ecf20Sopenharmony_cistruct msm_dsi_phy_shared_timings { 2048c2ecf20Sopenharmony_ci u32 clk_post; 2058c2ecf20Sopenharmony_ci u32 clk_pre; 2068c2ecf20Sopenharmony_ci bool clk_pre_inc_by_2; 2078c2ecf20Sopenharmony_ci}; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistruct msm_dsi_phy_clk_request { 2108c2ecf20Sopenharmony_ci unsigned long bitclk_rate; 2118c2ecf20Sopenharmony_ci unsigned long escclk_rate; 2128c2ecf20Sopenharmony_ci}; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_civoid msm_dsi_phy_driver_register(void); 2158c2ecf20Sopenharmony_civoid msm_dsi_phy_driver_unregister(void); 2168c2ecf20Sopenharmony_ciint msm_dsi_phy_enable(struct msm_dsi_phy *phy, int src_pll_id, 2178c2ecf20Sopenharmony_ci struct msm_dsi_phy_clk_request *clk_req); 2188c2ecf20Sopenharmony_civoid msm_dsi_phy_disable(struct msm_dsi_phy *phy); 2198c2ecf20Sopenharmony_civoid msm_dsi_phy_get_shared_timings(struct msm_dsi_phy *phy, 2208c2ecf20Sopenharmony_ci struct msm_dsi_phy_shared_timings *shared_timing); 2218c2ecf20Sopenharmony_cistruct msm_dsi_pll *msm_dsi_phy_get_pll(struct msm_dsi_phy *phy); 2228c2ecf20Sopenharmony_civoid msm_dsi_phy_set_usecase(struct msm_dsi_phy *phy, 2238c2ecf20Sopenharmony_ci enum msm_dsi_phy_usecase uc); 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci#endif /* __DSI_CONNECTOR_H__ */ 2268c2ecf20Sopenharmony_ci 227