18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _DP_PANEL_H_
78c2ecf20Sopenharmony_ci#define _DP_PANEL_H_
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <drm/msm_drm.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include "dp_aux.h"
128c2ecf20Sopenharmony_ci#include "dp_link.h"
138c2ecf20Sopenharmony_ci#include "dp_hpd.h"
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistruct edid;
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define DPRX_EXTENDED_DPCD_FIELD	0x2200
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define DP_DOWNSTREAM_PORTS		4
208c2ecf20Sopenharmony_ci#define DP_DOWNSTREAM_CAP_SIZE		4
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistruct dp_display_mode {
238c2ecf20Sopenharmony_ci	struct drm_display_mode drm_mode;
248c2ecf20Sopenharmony_ci	u32 capabilities;
258c2ecf20Sopenharmony_ci	u32 bpp;
268c2ecf20Sopenharmony_ci	u32 h_active_low;
278c2ecf20Sopenharmony_ci	u32 v_active_low;
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistruct dp_panel_in {
318c2ecf20Sopenharmony_ci	struct device *dev;
328c2ecf20Sopenharmony_ci	struct drm_dp_aux *aux;
338c2ecf20Sopenharmony_ci	struct dp_link *link;
348c2ecf20Sopenharmony_ci	struct dp_catalog *catalog;
358c2ecf20Sopenharmony_ci};
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cistruct dp_panel {
388c2ecf20Sopenharmony_ci	/* dpcd raw data */
398c2ecf20Sopenharmony_ci	u8 dpcd[DP_RECEIVER_CAP_SIZE + 1];
408c2ecf20Sopenharmony_ci	u8 ds_cap_info[DP_DOWNSTREAM_PORTS * DP_DOWNSTREAM_CAP_SIZE];
418c2ecf20Sopenharmony_ci	u32 ds_port_cnt;
428c2ecf20Sopenharmony_ci	u32 dfp_present;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	struct dp_link_info link_info;
458c2ecf20Sopenharmony_ci	struct drm_dp_desc desc;
468c2ecf20Sopenharmony_ci	struct edid *edid;
478c2ecf20Sopenharmony_ci	struct drm_connector *connector;
488c2ecf20Sopenharmony_ci	struct dp_display_mode dp_mode;
498c2ecf20Sopenharmony_ci	bool video_test;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	u32 vic;
528c2ecf20Sopenharmony_ci	u32 max_pclk_khz;
538c2ecf20Sopenharmony_ci	u32 max_dp_lanes;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	u32 max_bw_code;
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ciint dp_panel_init_panel_info(struct dp_panel *dp_panel);
598c2ecf20Sopenharmony_ciint dp_panel_deinit(struct dp_panel *dp_panel);
608c2ecf20Sopenharmony_ciint dp_panel_timing_cfg(struct dp_panel *dp_panel);
618c2ecf20Sopenharmony_civoid dp_panel_dump_regs(struct dp_panel *dp_panel);
628c2ecf20Sopenharmony_ciint dp_panel_read_sink_caps(struct dp_panel *dp_panel,
638c2ecf20Sopenharmony_ci		struct drm_connector *connector);
648c2ecf20Sopenharmony_ciu32 dp_panel_get_mode_bpp(struct dp_panel *dp_panel, u32 mode_max_bpp,
658c2ecf20Sopenharmony_ci			u32 mode_pclk_khz);
668c2ecf20Sopenharmony_ciint dp_panel_get_modes(struct dp_panel *dp_panel,
678c2ecf20Sopenharmony_ci		struct drm_connector *connector, struct dp_display_mode *mode);
688c2ecf20Sopenharmony_civoid dp_panel_handle_sink_request(struct dp_panel *dp_panel);
698c2ecf20Sopenharmony_civoid dp_panel_tpg_config(struct dp_panel *dp_panel, bool enable);
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci/**
728c2ecf20Sopenharmony_ci * is_link_rate_valid() - validates the link rate
738c2ecf20Sopenharmony_ci * @lane_rate: link rate requested by the sink
748c2ecf20Sopenharmony_ci *
758c2ecf20Sopenharmony_ci * Returns true if the requested link rate is supported.
768c2ecf20Sopenharmony_ci */
778c2ecf20Sopenharmony_cistatic inline bool is_link_rate_valid(u32 bw_code)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	return (bw_code == DP_LINK_BW_1_62 ||
808c2ecf20Sopenharmony_ci		bw_code == DP_LINK_BW_2_7 ||
818c2ecf20Sopenharmony_ci		bw_code == DP_LINK_BW_5_4 ||
828c2ecf20Sopenharmony_ci		bw_code == DP_LINK_BW_8_1);
838c2ecf20Sopenharmony_ci}
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci/**
868c2ecf20Sopenharmony_ci * dp_link_is_lane_count_valid() - validates the lane count
878c2ecf20Sopenharmony_ci * @lane_count: lane count requested by the sink
888c2ecf20Sopenharmony_ci *
898c2ecf20Sopenharmony_ci * Returns true if the requested lane count is supported.
908c2ecf20Sopenharmony_ci */
918c2ecf20Sopenharmony_cistatic inline bool is_lane_count_valid(u32 lane_count)
928c2ecf20Sopenharmony_ci{
938c2ecf20Sopenharmony_ci	return (lane_count == 1 ||
948c2ecf20Sopenharmony_ci		lane_count == 2 ||
958c2ecf20Sopenharmony_ci		lane_count == 4);
968c2ecf20Sopenharmony_ci}
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistruct dp_panel *dp_panel_get(struct dp_panel_in *in);
998c2ecf20Sopenharmony_civoid dp_panel_put(struct dp_panel *dp_panel);
1008c2ecf20Sopenharmony_ci#endif /* _DP_PANEL_H_ */
101