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