mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Sometimes the Dock is disconnected, but cdn_dp_encoder_disable is not triggered by DRM. For example, unplug the Dock in console mode, and re-plug it again, the cdn_dp_event_work will try to get the sink count of Dock, since the DP is still active. But the Dock has been powered down, it need re-power on, and wait for a while until it is ready to DPCD communication. Signed-off-by: Chris Zhong <zyw@rock-chips.com>
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2016 Chris Zhong <zyw@rock-chips.com>
 | 
						|
 * Copyright (C) 2016 ROCKCHIP, Inc.
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation; either version 2 of the License.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _CDN_DP_CORE_H
 | 
						|
#define _CDN_DP_CORE_H
 | 
						|
 | 
						|
#include <drm/drmP.h>
 | 
						|
#include <drm/drm_crtc_helper.h>
 | 
						|
#include <drm/drm_dp_helper.h>
 | 
						|
#include <drm/drm_panel.h>
 | 
						|
#include "rockchip_drm_drv.h"
 | 
						|
 | 
						|
#define MAX_PHY		2
 | 
						|
 | 
						|
enum audio_format {
 | 
						|
	AFMT_I2S = 0,
 | 
						|
	AFMT_SPDIF = 1,
 | 
						|
	AFMT_UNUSED,
 | 
						|
};
 | 
						|
 | 
						|
struct audio_info {
 | 
						|
	enum audio_format format;
 | 
						|
	int sample_rate;
 | 
						|
	int channels;
 | 
						|
	int sample_width;
 | 
						|
};
 | 
						|
 | 
						|
enum vic_pxl_encoding_format {
 | 
						|
	PXL_RGB = 0x1,
 | 
						|
	YCBCR_4_4_4 = 0x2,
 | 
						|
	YCBCR_4_2_2 = 0x4,
 | 
						|
	YCBCR_4_2_0 = 0x8,
 | 
						|
	Y_ONLY = 0x10,
 | 
						|
};
 | 
						|
 | 
						|
struct video_info {
 | 
						|
	bool h_sync_polarity;
 | 
						|
	bool v_sync_polarity;
 | 
						|
	bool interlaced;
 | 
						|
	int color_depth;
 | 
						|
	enum vic_pxl_encoding_format color_fmt;
 | 
						|
};
 | 
						|
 | 
						|
struct cdn_firmware_header {
 | 
						|
	u32 size_bytes; /* size of the entire header+image(s) in bytes */
 | 
						|
	u32 header_size; /* size of just the header in bytes */
 | 
						|
	u32 iram_size; /* size of iram */
 | 
						|
	u32 dram_size; /* size of dram */
 | 
						|
};
 | 
						|
 | 
						|
struct cdn_dp_port {
 | 
						|
	struct cdn_dp_device *dp;
 | 
						|
	struct notifier_block event_nb;
 | 
						|
	struct extcon_dev *extcon;
 | 
						|
	struct phy *phy;
 | 
						|
	u8 lanes;
 | 
						|
	bool phy_enabled;
 | 
						|
	u8 id;
 | 
						|
};
 | 
						|
 | 
						|
struct cdn_dp_device {
 | 
						|
	struct device *dev;
 | 
						|
	struct drm_device *drm_dev;
 | 
						|
	struct drm_connector connector;
 | 
						|
	struct drm_encoder encoder;
 | 
						|
	struct drm_display_mode mode;
 | 
						|
	struct platform_device *audio_pdev;
 | 
						|
	struct work_struct event_work;
 | 
						|
	struct edid *edid;
 | 
						|
 | 
						|
	struct mutex lock;
 | 
						|
	bool connected;
 | 
						|
	bool active;
 | 
						|
	bool suspended;
 | 
						|
 | 
						|
	const struct firmware *fw;	/* cdn dp firmware */
 | 
						|
	unsigned int fw_version;	/* cdn fw version */
 | 
						|
	bool fw_loaded;
 | 
						|
 | 
						|
	void __iomem *regs;
 | 
						|
	struct regmap *grf;
 | 
						|
	struct clk *core_clk;
 | 
						|
	struct clk *pclk;
 | 
						|
	struct clk *spdif_clk;
 | 
						|
	struct clk *grf_clk;
 | 
						|
	struct reset_control *spdif_rst;
 | 
						|
	struct reset_control *dptx_rst;
 | 
						|
	struct reset_control *apb_rst;
 | 
						|
	struct reset_control *core_rst;
 | 
						|
	struct audio_info audio_info;
 | 
						|
	struct video_info video_info;
 | 
						|
	struct drm_dp_link link;
 | 
						|
	struct cdn_dp_port *port[MAX_PHY];
 | 
						|
	u8 ports;
 | 
						|
	u8 lanes;
 | 
						|
	int active_port;
 | 
						|
 | 
						|
	u8 dpcd[DP_RECEIVER_CAP_SIZE];
 | 
						|
	bool sink_has_audio;
 | 
						|
};
 | 
						|
#endif  /* _CDN_DP_CORE_H */
 |