| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved. |
| */ |
| |
| #ifndef _DP_PARSER_H_ |
| #define _DP_PARSER_H_ |
| |
| #include <linux/platform_device.h> |
| #include <linux/phy/phy.h> |
| #include <linux/phy/phy-dp.h> |
| |
| #include "msm_drv.h" |
| |
| #define DP_LABEL "MDSS DP DISPLAY" |
| #define DP_MAX_PIXEL_CLK_KHZ 675000 |
| #define DP_MAX_NUM_DP_LANES 4 |
| #define DP_LINK_RATE_HBR2 540000 /* kbytes */ |
| |
| enum dp_pm_type { |
| DP_CORE_PM, |
| DP_CTRL_PM, |
| DP_STREAM_PM, |
| DP_PHY_PM, |
| DP_MAX_PM |
| }; |
| |
| struct dss_io_region { |
| size_t len; |
| void __iomem *base; |
| }; |
| |
| struct dss_io_data { |
| struct dss_io_region ahb; |
| struct dss_io_region aux; |
| struct dss_io_region link; |
| struct dss_io_region p0; |
| }; |
| |
| static inline const char *dp_parser_pm_name(enum dp_pm_type module) |
| { |
| switch (module) { |
| case DP_CORE_PM: return "DP_CORE_PM"; |
| case DP_CTRL_PM: return "DP_CTRL_PM"; |
| case DP_STREAM_PM: return "DP_STREAM_PM"; |
| case DP_PHY_PM: return "DP_PHY_PM"; |
| default: return "???"; |
| } |
| } |
| |
| /** |
| * struct dp_display_data - display related device tree data. |
| * |
| * @ctrl_node: referece to controller device |
| * @phy_node: reference to phy device |
| * @is_active: is the controller currently active |
| * @name: name of the display |
| * @display_type: type of the display |
| */ |
| struct dp_display_data { |
| struct device_node *ctrl_node; |
| struct device_node *phy_node; |
| bool is_active; |
| const char *name; |
| const char *display_type; |
| }; |
| |
| /** |
| * struct dp_ctrl_resource - controller's IO related data |
| * |
| * @dp_controller: Display Port controller mapped memory address |
| * @phy_io: phy's mapped memory address |
| */ |
| struct dp_io { |
| struct dss_io_data dp_controller; |
| struct phy *phy; |
| union phy_configure_opts phy_opts; |
| }; |
| |
| /** |
| * struct dp_pinctrl - DP's pin control |
| * |
| * @pin: pin-controller's instance |
| * @state_active: active state pin control |
| * @state_hpd_active: hpd active state pin control |
| * @state_suspend: suspend state pin control |
| */ |
| struct dp_pinctrl { |
| struct pinctrl *pin; |
| struct pinctrl_state *state_active; |
| struct pinctrl_state *state_hpd_active; |
| struct pinctrl_state *state_suspend; |
| }; |
| |
| /* Regulators for DP devices */ |
| struct dp_reg_entry { |
| char name[32]; |
| int enable_load; |
| int disable_load; |
| }; |
| |
| struct dss_module_power { |
| unsigned int num_clk; |
| struct clk_bulk_data *clocks; |
| }; |
| |
| /** |
| * struct dp_parser - DP parser's data exposed to clients |
| * |
| * @pdev: platform data of the client |
| * @mp: gpio, regulator and clock related data |
| * @pinctrl: pin-control related data |
| * @disp_data: controller's display related data |
| * @parse: function to be called by client to parse device tree. |
| */ |
| struct dp_parser { |
| struct platform_device *pdev; |
| struct dss_module_power mp[DP_MAX_PM]; |
| struct dp_pinctrl pinctrl; |
| struct dp_io io; |
| struct dp_display_data disp_data; |
| u32 max_dp_lanes; |
| u32 max_dp_link_rate; |
| struct drm_bridge *next_bridge; |
| |
| int (*parse)(struct dp_parser *parser); |
| }; |
| |
| /** |
| * dp_parser_get() - get the DP's device tree parser module |
| * |
| * @pdev: platform data of the client |
| * return: pointer to dp_parser structure. |
| * |
| * This function provides client capability to parse the |
| * device tree and populate the data structures. The data |
| * related to clock, regulators, pin-control and other |
| * can be parsed using this module. |
| */ |
| struct dp_parser *dp_parser_get(struct platform_device *pdev); |
| |
| /** |
| * devm_dp_parser_find_next_bridge() - find an additional bridge to DP |
| * |
| * @dev: device to tie bridge lifetime to |
| * @parser: dp_parser data from client |
| * |
| * This function is used to find any additional bridge attached to |
| * the DP controller. The eDP interface requires a panel bridge. |
| * |
| * Return: 0 if able to get the bridge, otherwise negative errno for failure. |
| */ |
| int devm_dp_parser_find_next_bridge(struct device *dev, struct dp_parser *parser); |
| |
| #endif |