1c943b494SChandan Uddaraju /* SPDX-License-Identifier: GPL-2.0-only */ 2c943b494SChandan Uddaraju /* 3c943b494SChandan Uddaraju * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. 4c943b494SChandan Uddaraju */ 5c943b494SChandan Uddaraju 6c943b494SChandan Uddaraju #ifndef _DP_PARSER_H_ 7c943b494SChandan Uddaraju #define _DP_PARSER_H_ 8c943b494SChandan Uddaraju 9c943b494SChandan Uddaraju #include <linux/platform_device.h> 10937f941cSStephen Boyd #include <linux/phy/phy.h> 11937f941cSStephen Boyd #include <linux/phy/phy-dp.h> 12c943b494SChandan Uddaraju 135752c921SDmitry Baryshkov #include "dp_clk_util.h" 14c943b494SChandan Uddaraju #include "msm_drv.h" 15c943b494SChandan Uddaraju 16c943b494SChandan Uddaraju #define DP_LABEL "MDSS DP DISPLAY" 17c943b494SChandan Uddaraju #define DP_MAX_PIXEL_CLK_KHZ 675000 18c943b494SChandan Uddaraju #define DP_MAX_NUM_DP_LANES 4 19c943b494SChandan Uddaraju 20c943b494SChandan Uddaraju enum dp_pm_type { 21c943b494SChandan Uddaraju DP_CORE_PM, 22c943b494SChandan Uddaraju DP_CTRL_PM, 238ede2eccSKuogee Hsieh DP_STREAM_PM, 24c943b494SChandan Uddaraju DP_PHY_PM, 25c943b494SChandan Uddaraju DP_MAX_PM 26c943b494SChandan Uddaraju }; 27c943b494SChandan Uddaraju 28060c160fSBjorn Andersson struct dss_io_region { 29ef501dbfSBjorn Andersson size_t len; 30c943b494SChandan Uddaraju void __iomem *base; 31c943b494SChandan Uddaraju }; 32c943b494SChandan Uddaraju 33060c160fSBjorn Andersson struct dss_io_data { 34060c160fSBjorn Andersson struct dss_io_region ahb; 35060c160fSBjorn Andersson struct dss_io_region aux; 36060c160fSBjorn Andersson struct dss_io_region link; 37060c160fSBjorn Andersson struct dss_io_region p0; 38060c160fSBjorn Andersson }; 39060c160fSBjorn Andersson 40c943b494SChandan Uddaraju static inline const char *dp_parser_pm_name(enum dp_pm_type module) 41c943b494SChandan Uddaraju { 42c943b494SChandan Uddaraju switch (module) { 43c943b494SChandan Uddaraju case DP_CORE_PM: return "DP_CORE_PM"; 44c943b494SChandan Uddaraju case DP_CTRL_PM: return "DP_CTRL_PM"; 458ede2eccSKuogee Hsieh case DP_STREAM_PM: return "DP_STREAM_PM"; 46c943b494SChandan Uddaraju case DP_PHY_PM: return "DP_PHY_PM"; 47c943b494SChandan Uddaraju default: return "???"; 48c943b494SChandan Uddaraju } 49c943b494SChandan Uddaraju } 50c943b494SChandan Uddaraju 51c943b494SChandan Uddaraju /** 52c943b494SChandan Uddaraju * struct dp_display_data - display related device tree data. 53c943b494SChandan Uddaraju * 54c943b494SChandan Uddaraju * @ctrl_node: referece to controller device 55c943b494SChandan Uddaraju * @phy_node: reference to phy device 56c943b494SChandan Uddaraju * @is_active: is the controller currently active 57c943b494SChandan Uddaraju * @name: name of the display 58c943b494SChandan Uddaraju * @display_type: type of the display 59c943b494SChandan Uddaraju */ 60c943b494SChandan Uddaraju struct dp_display_data { 61c943b494SChandan Uddaraju struct device_node *ctrl_node; 62c943b494SChandan Uddaraju struct device_node *phy_node; 63c943b494SChandan Uddaraju bool is_active; 64c943b494SChandan Uddaraju const char *name; 65c943b494SChandan Uddaraju const char *display_type; 66c943b494SChandan Uddaraju }; 67c943b494SChandan Uddaraju 68c943b494SChandan Uddaraju /** 69c943b494SChandan Uddaraju * struct dp_ctrl_resource - controller's IO related data 70c943b494SChandan Uddaraju * 71c943b494SChandan Uddaraju * @dp_controller: Display Port controller mapped memory address 72c943b494SChandan Uddaraju * @phy_io: phy's mapped memory address 73c943b494SChandan Uddaraju */ 74c943b494SChandan Uddaraju struct dp_io { 75c943b494SChandan Uddaraju struct dss_io_data dp_controller; 76937f941cSStephen Boyd struct phy *phy; 77937f941cSStephen Boyd union phy_configure_opts phy_opts; 78c943b494SChandan Uddaraju }; 79c943b494SChandan Uddaraju 80c943b494SChandan Uddaraju /** 81c943b494SChandan Uddaraju * struct dp_pinctrl - DP's pin control 82c943b494SChandan Uddaraju * 83c943b494SChandan Uddaraju * @pin: pin-controller's instance 84c943b494SChandan Uddaraju * @state_active: active state pin control 85c943b494SChandan Uddaraju * @state_hpd_active: hpd active state pin control 86c943b494SChandan Uddaraju * @state_suspend: suspend state pin control 87c943b494SChandan Uddaraju */ 88c943b494SChandan Uddaraju struct dp_pinctrl { 89c943b494SChandan Uddaraju struct pinctrl *pin; 90c943b494SChandan Uddaraju struct pinctrl_state *state_active; 91c943b494SChandan Uddaraju struct pinctrl_state *state_hpd_active; 92c943b494SChandan Uddaraju struct pinctrl_state *state_suspend; 93c943b494SChandan Uddaraju }; 94c943b494SChandan Uddaraju 95c943b494SChandan Uddaraju #define DP_DEV_REGULATOR_MAX 4 96c943b494SChandan Uddaraju 97c943b494SChandan Uddaraju /* Regulators for DP devices */ 98c943b494SChandan Uddaraju struct dp_reg_entry { 99c943b494SChandan Uddaraju char name[32]; 100c943b494SChandan Uddaraju int enable_load; 101c943b494SChandan Uddaraju int disable_load; 102c943b494SChandan Uddaraju }; 103c943b494SChandan Uddaraju 104c943b494SChandan Uddaraju struct dp_regulator_cfg { 105c943b494SChandan Uddaraju int num; 106c943b494SChandan Uddaraju struct dp_reg_entry regs[DP_DEV_REGULATOR_MAX]; 107c943b494SChandan Uddaraju }; 108c943b494SChandan Uddaraju 109c943b494SChandan Uddaraju /** 110c943b494SChandan Uddaraju * struct dp_parser - DP parser's data exposed to clients 111c943b494SChandan Uddaraju * 112c943b494SChandan Uddaraju * @pdev: platform data of the client 113c943b494SChandan Uddaraju * @mp: gpio, regulator and clock related data 114c943b494SChandan Uddaraju * @pinctrl: pin-control related data 115c943b494SChandan Uddaraju * @disp_data: controller's display related data 116c943b494SChandan Uddaraju * @parse: function to be called by client to parse device tree. 117c943b494SChandan Uddaraju */ 118c943b494SChandan Uddaraju struct dp_parser { 119c943b494SChandan Uddaraju struct platform_device *pdev; 120c943b494SChandan Uddaraju struct dss_module_power mp[DP_MAX_PM]; 121c943b494SChandan Uddaraju struct dp_pinctrl pinctrl; 122c943b494SChandan Uddaraju struct dp_io io; 123c943b494SChandan Uddaraju struct dp_display_data disp_data; 124c943b494SChandan Uddaraju const struct dp_regulator_cfg *regulator_cfg; 125c943b494SChandan Uddaraju u32 max_dp_lanes; 1269aa92468SDmitry Baryshkov struct drm_bridge *next_bridge; 127c943b494SChandan Uddaraju 128*c3bf8e21SSankeerth Billakanti int (*parse)(struct dp_parser *parser); 129c943b494SChandan Uddaraju }; 130c943b494SChandan Uddaraju 131c943b494SChandan Uddaraju /** 132c943b494SChandan Uddaraju * dp_parser_get() - get the DP's device tree parser module 133c943b494SChandan Uddaraju * 134c943b494SChandan Uddaraju * @pdev: platform data of the client 135c943b494SChandan Uddaraju * return: pointer to dp_parser structure. 136c943b494SChandan Uddaraju * 137c943b494SChandan Uddaraju * This function provides client capability to parse the 138c943b494SChandan Uddaraju * device tree and populate the data structures. The data 139c943b494SChandan Uddaraju * related to clock, regulators, pin-control and other 140c943b494SChandan Uddaraju * can be parsed using this module. 141c943b494SChandan Uddaraju */ 142c943b494SChandan Uddaraju struct dp_parser *dp_parser_get(struct platform_device *pdev); 143c943b494SChandan Uddaraju 144*c3bf8e21SSankeerth Billakanti /** 145*c3bf8e21SSankeerth Billakanti * dp_parser_find_next_bridge() - find an additional bridge to DP 146*c3bf8e21SSankeerth Billakanti * 147*c3bf8e21SSankeerth Billakanti * @parser: dp_parser data from client 148*c3bf8e21SSankeerth Billakanti * 149*c3bf8e21SSankeerth Billakanti * This function is used to find any additional bridge attached to 150*c3bf8e21SSankeerth Billakanti * the DP controller. The eDP interface requires a panel bridge. 151*c3bf8e21SSankeerth Billakanti * 152*c3bf8e21SSankeerth Billakanti * Return: 0 if able to get the bridge, otherwise negative errno for failure. 153*c3bf8e21SSankeerth Billakanti */ 154*c3bf8e21SSankeerth Billakanti int dp_parser_find_next_bridge(struct dp_parser *parser); 155*c3bf8e21SSankeerth Billakanti 156c943b494SChandan Uddaraju #endif 157