162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) STMicroelectronics SA 2014 462306a36Sopenharmony_ci * Author: Vincent Abriou <vincent.abriou@st.com> for STMicroelectronics. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _STI_HDMI_H_ 862306a36Sopenharmony_ci#define _STI_HDMI_H_ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/hdmi.h> 1162306a36Sopenharmony_ci#include <linux/platform_device.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <media/cec-notifier.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <drm/drm_modes.h> 1662306a36Sopenharmony_ci#include <drm/drm_property.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define HDMI_STA 0x0010 1962306a36Sopenharmony_ci#define HDMI_STA_DLL_LCK BIT(5) 2062306a36Sopenharmony_ci#define HDMI_STA_HOT_PLUG BIT(4) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistruct sti_hdmi; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistruct hdmi_phy_ops { 2562306a36Sopenharmony_ci bool (*start)(struct sti_hdmi *hdmi); 2662306a36Sopenharmony_ci void (*stop)(struct sti_hdmi *hdmi); 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct hdmi_audio_params { 3062306a36Sopenharmony_ci bool enabled; 3162306a36Sopenharmony_ci unsigned int sample_width; 3262306a36Sopenharmony_ci unsigned int sample_rate; 3362306a36Sopenharmony_ci struct hdmi_audio_infoframe cea; 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define DEFAULT_COLORSPACE_MODE HDMI_COLORSPACE_RGB 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/** 3962306a36Sopenharmony_ci * STI hdmi structure 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * @dev: driver device 4262306a36Sopenharmony_ci * @drm_dev: pointer to drm device 4362306a36Sopenharmony_ci * @mode: current display mode selected 4462306a36Sopenharmony_ci * @regs: hdmi register 4562306a36Sopenharmony_ci * @syscfg: syscfg register for pll rejection configuration 4662306a36Sopenharmony_ci * @clk_pix: hdmi pixel clock 4762306a36Sopenharmony_ci * @clk_tmds: hdmi tmds clock 4862306a36Sopenharmony_ci * @clk_phy: hdmi phy clock 4962306a36Sopenharmony_ci * @clk_audio: hdmi audio clock 5062306a36Sopenharmony_ci * @irq: hdmi interrupt number 5162306a36Sopenharmony_ci * @irq_status: interrupt status register 5262306a36Sopenharmony_ci * @phy_ops: phy start/stop operations 5362306a36Sopenharmony_ci * @enabled: true if hdmi is enabled else false 5462306a36Sopenharmony_ci * @hpd: hot plug detect status 5562306a36Sopenharmony_ci * @wait_event: wait event 5662306a36Sopenharmony_ci * @event_received: wait event status 5762306a36Sopenharmony_ci * @reset: reset control of the hdmi phy 5862306a36Sopenharmony_ci * @ddc_adapt: i2c ddc adapter 5962306a36Sopenharmony_ci * @colorspace: current colorspace selected 6062306a36Sopenharmony_ci * @audio_pdev: ASoC hdmi-codec platform device 6162306a36Sopenharmony_ci * @audio: hdmi audio parameters. 6262306a36Sopenharmony_ci * @drm_connector: hdmi connector 6362306a36Sopenharmony_ci * @notifier: hotplug detect notifier 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_cistruct sti_hdmi { 6662306a36Sopenharmony_ci struct device dev; 6762306a36Sopenharmony_ci struct drm_device *drm_dev; 6862306a36Sopenharmony_ci struct drm_display_mode mode; 6962306a36Sopenharmony_ci void __iomem *regs; 7062306a36Sopenharmony_ci void __iomem *syscfg; 7162306a36Sopenharmony_ci struct clk *clk_pix; 7262306a36Sopenharmony_ci struct clk *clk_tmds; 7362306a36Sopenharmony_ci struct clk *clk_phy; 7462306a36Sopenharmony_ci struct clk *clk_audio; 7562306a36Sopenharmony_ci int irq; 7662306a36Sopenharmony_ci u32 irq_status; 7762306a36Sopenharmony_ci struct hdmi_phy_ops *phy_ops; 7862306a36Sopenharmony_ci bool enabled; 7962306a36Sopenharmony_ci bool hpd; 8062306a36Sopenharmony_ci wait_queue_head_t wait_event; 8162306a36Sopenharmony_ci bool event_received; 8262306a36Sopenharmony_ci struct reset_control *reset; 8362306a36Sopenharmony_ci struct i2c_adapter *ddc_adapt; 8462306a36Sopenharmony_ci enum hdmi_colorspace colorspace; 8562306a36Sopenharmony_ci struct platform_device *audio_pdev; 8662306a36Sopenharmony_ci struct hdmi_audio_params audio; 8762306a36Sopenharmony_ci struct drm_connector *drm_connector; 8862306a36Sopenharmony_ci struct cec_notifier *notifier; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciu32 hdmi_read(struct sti_hdmi *hdmi, int offset); 9262306a36Sopenharmony_civoid hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/** 9562306a36Sopenharmony_ci * hdmi phy config structure 9662306a36Sopenharmony_ci * 9762306a36Sopenharmony_ci * A pointer to an array of these structures is passed to a TMDS (HDMI) output 9862306a36Sopenharmony_ci * via the control interface to provide board and SoC specific 9962306a36Sopenharmony_ci * configurations of the HDMI PHY. Each entry in the array specifies a hardware 10062306a36Sopenharmony_ci * specific configuration for a given TMDS clock frequency range. 10162306a36Sopenharmony_ci * 10262306a36Sopenharmony_ci * @min_tmds_freq: Lower bound of TMDS clock frequency this entry applies to 10362306a36Sopenharmony_ci * @max_tmds_freq: Upper bound of TMDS clock frequency this entry applies to 10462306a36Sopenharmony_ci * @config: SoC specific register configuration 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_cistruct hdmi_phy_config { 10762306a36Sopenharmony_ci u32 min_tmds_freq; 10862306a36Sopenharmony_ci u32 max_tmds_freq; 10962306a36Sopenharmony_ci u32 config[4]; 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#endif 113