mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 18:24:14 +08:00
13e0e20694
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>
113 lines
2.5 KiB
C
113 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 */
|