xref: /OK3568_Linux_fs/kernel/include/sound/hdmi-codec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * hdmi-codec.h - HDMI Codec driver API
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Jyri Sarha <jsarha@ti.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __HDMI_CODEC_H__
11*4882a593Smuzhiyun #define __HDMI_CODEC_H__
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/of_graph.h>
14*4882a593Smuzhiyun #include <linux/hdmi.h>
15*4882a593Smuzhiyun #include <drm/drm_edid.h>
16*4882a593Smuzhiyun #include <sound/asoundef.h>
17*4882a593Smuzhiyun #include <sound/soc.h>
18*4882a593Smuzhiyun #include <uapi/sound/asound.h>
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * Protocol between ASoC cpu-dai and HDMI-encoder
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun struct hdmi_codec_daifmt {
24*4882a593Smuzhiyun 	enum {
25*4882a593Smuzhiyun 		HDMI_I2S,
26*4882a593Smuzhiyun 		HDMI_RIGHT_J,
27*4882a593Smuzhiyun 		HDMI_LEFT_J,
28*4882a593Smuzhiyun 		HDMI_DSP_A,
29*4882a593Smuzhiyun 		HDMI_DSP_B,
30*4882a593Smuzhiyun 		HDMI_AC97,
31*4882a593Smuzhiyun 		HDMI_SPDIF,
32*4882a593Smuzhiyun 	} fmt;
33*4882a593Smuzhiyun 	unsigned int bit_clk_inv:1;
34*4882a593Smuzhiyun 	unsigned int frame_clk_inv:1;
35*4882a593Smuzhiyun 	unsigned int bit_clk_master:1;
36*4882a593Smuzhiyun 	unsigned int frame_clk_master:1;
37*4882a593Smuzhiyun 	/* bit_fmt could be standard PCM format or
38*4882a593Smuzhiyun 	 * IEC958 encoded format. ALSA IEC958 plugin will pass
39*4882a593Smuzhiyun 	 * IEC958_SUBFRAME format to the underneath driver.
40*4882a593Smuzhiyun 	 */
41*4882a593Smuzhiyun 	snd_pcm_format_t bit_fmt;
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun  * HDMI audio parameters
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun struct hdmi_codec_params {
48*4882a593Smuzhiyun 	struct hdmi_audio_infoframe cea;
49*4882a593Smuzhiyun 	struct snd_aes_iec958 iec;
50*4882a593Smuzhiyun 	int sample_rate;
51*4882a593Smuzhiyun 	int sample_width;
52*4882a593Smuzhiyun 	int channels;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun typedef void (*hdmi_codec_plugged_cb)(struct device *dev,
56*4882a593Smuzhiyun 				      bool plugged);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct hdmi_codec_pdata;
59*4882a593Smuzhiyun struct hdmi_codec_ops {
60*4882a593Smuzhiyun 	/*
61*4882a593Smuzhiyun 	 * Called when ASoC starts an audio stream setup.
62*4882a593Smuzhiyun 	 * Optional
63*4882a593Smuzhiyun 	 */
64*4882a593Smuzhiyun 	int (*audio_startup)(struct device *dev, void *data);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/*
67*4882a593Smuzhiyun 	 * Configures HDMI-encoder for audio stream.
68*4882a593Smuzhiyun 	 * Having either prepare or hw_params is mandatory.
69*4882a593Smuzhiyun 	 */
70*4882a593Smuzhiyun 	int (*hw_params)(struct device *dev, void *data,
71*4882a593Smuzhiyun 			 struct hdmi_codec_daifmt *fmt,
72*4882a593Smuzhiyun 			 struct hdmi_codec_params *hparms);
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	/*
75*4882a593Smuzhiyun 	 * Configures HDMI-encoder for audio stream. Can be called
76*4882a593Smuzhiyun 	 * multiple times for each setup.
77*4882a593Smuzhiyun 	 *
78*4882a593Smuzhiyun 	 * Having either prepare or hw_params is mandatory.
79*4882a593Smuzhiyun 	 */
80*4882a593Smuzhiyun 	int (*prepare)(struct device *dev, void *data,
81*4882a593Smuzhiyun 		       struct hdmi_codec_daifmt *fmt,
82*4882a593Smuzhiyun 		       struct hdmi_codec_params *hparms);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	/*
85*4882a593Smuzhiyun 	 * Shuts down the audio stream.
86*4882a593Smuzhiyun 	 * Mandatory
87*4882a593Smuzhiyun 	 */
88*4882a593Smuzhiyun 	void (*audio_shutdown)(struct device *dev, void *data);
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/*
91*4882a593Smuzhiyun 	 * Mute/unmute HDMI audio stream.
92*4882a593Smuzhiyun 	 * Optional
93*4882a593Smuzhiyun 	 */
94*4882a593Smuzhiyun 	int (*mute_stream)(struct device *dev, void *data,
95*4882a593Smuzhiyun 			   bool enable, int direction);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	/*
98*4882a593Smuzhiyun 	 * Provides EDID-Like-Data from connected HDMI device.
99*4882a593Smuzhiyun 	 * Optional
100*4882a593Smuzhiyun 	 */
101*4882a593Smuzhiyun 	int (*get_eld)(struct device *dev, void *data,
102*4882a593Smuzhiyun 		       uint8_t *buf, size_t len);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	/*
105*4882a593Smuzhiyun 	 * Getting DAI ID
106*4882a593Smuzhiyun 	 * Optional
107*4882a593Smuzhiyun 	 */
108*4882a593Smuzhiyun 	int (*get_dai_id)(struct snd_soc_component *comment,
109*4882a593Smuzhiyun 			  struct device_node *endpoint);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	/*
112*4882a593Smuzhiyun 	 * Hook callback function to handle connector plug event.
113*4882a593Smuzhiyun 	 * Optional
114*4882a593Smuzhiyun 	 */
115*4882a593Smuzhiyun 	int (*hook_plugged_cb)(struct device *dev, void *data,
116*4882a593Smuzhiyun 			       hdmi_codec_plugged_cb fn,
117*4882a593Smuzhiyun 			       struct device *codec_dev);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	/* bit field */
120*4882a593Smuzhiyun 	unsigned int no_capture_mute:1;
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* HDMI codec initalization data */
124*4882a593Smuzhiyun struct hdmi_codec_pdata {
125*4882a593Smuzhiyun 	const struct hdmi_codec_ops *ops;
126*4882a593Smuzhiyun 	uint i2s:1;
127*4882a593Smuzhiyun 	uint spdif:1;
128*4882a593Smuzhiyun 	int max_i2s_channels;
129*4882a593Smuzhiyun 	void *data;
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct snd_soc_component;
133*4882a593Smuzhiyun struct snd_soc_jack;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec"
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #endif /* __HDMI_CODEC_H__ */
138