11802d0beSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 209184118SJyri Sarha /* 309184118SJyri Sarha * hdmi-codec.h - HDMI Codec driver API 409184118SJyri Sarha * 57ed33ea6SAlexander A. Klimov * Copyright (C) 2014 Texas Instruments Incorporated - https://www.ti.com 609184118SJyri Sarha * 709184118SJyri Sarha * Author: Jyri Sarha <jsarha@ti.com> 809184118SJyri Sarha */ 909184118SJyri Sarha 1009184118SJyri Sarha #ifndef __HDMI_CODEC_H__ 1109184118SJyri Sarha #define __HDMI_CODEC_H__ 1209184118SJyri Sarha 1396203fb4SKuninori Morimoto #include <linux/of_graph.h> 1409184118SJyri Sarha #include <linux/hdmi.h> 1509184118SJyri Sarha #include <drm/drm_edid.h> 1609184118SJyri Sarha #include <sound/asoundef.h> 1796203fb4SKuninori Morimoto #include <sound/soc.h> 1809184118SJyri Sarha #include <uapi/sound/asound.h> 1909184118SJyri Sarha 2009184118SJyri Sarha /* 2109184118SJyri Sarha * Protocol between ASoC cpu-dai and HDMI-encoder 2209184118SJyri Sarha */ 2309184118SJyri Sarha struct hdmi_codec_daifmt { 2409184118SJyri Sarha enum { 2509184118SJyri Sarha HDMI_I2S, 2609184118SJyri Sarha HDMI_RIGHT_J, 2709184118SJyri Sarha HDMI_LEFT_J, 2809184118SJyri Sarha HDMI_DSP_A, 2909184118SJyri Sarha HDMI_DSP_B, 3009184118SJyri Sarha HDMI_AC97, 3109184118SJyri Sarha HDMI_SPDIF, 3209184118SJyri Sarha } fmt; 339e4d59adSTakashi Sakamoto unsigned int bit_clk_inv:1; 349e4d59adSTakashi Sakamoto unsigned int frame_clk_inv:1; 359f1c8677SMark Brown unsigned int bit_clk_provider:1; 369f1c8677SMark Brown unsigned int frame_clk_provider:1; 3728785f54SSia Jee Heng /* bit_fmt could be standard PCM format or 3828785f54SSia Jee Heng * IEC958 encoded format. ALSA IEC958 plugin will pass 3928785f54SSia Jee Heng * IEC958_SUBFRAME format to the underneath driver. 4028785f54SSia Jee Heng */ 4128785f54SSia Jee Heng snd_pcm_format_t bit_fmt; 4209184118SJyri Sarha }; 4309184118SJyri Sarha 4409184118SJyri Sarha /* 4509184118SJyri Sarha * HDMI audio parameters 4609184118SJyri Sarha */ 4709184118SJyri Sarha struct hdmi_codec_params { 4809184118SJyri Sarha struct hdmi_audio_infoframe cea; 4909184118SJyri Sarha struct snd_aes_iec958 iec; 5009184118SJyri Sarha int sample_rate; 5109184118SJyri Sarha int sample_width; 5209184118SJyri Sarha int channels; 5309184118SJyri Sarha }; 5409184118SJyri Sarha 556fa5963cSCheng-Yi Chiang typedef void (*hdmi_codec_plugged_cb)(struct device *dev, 566fa5963cSCheng-Yi Chiang bool plugged); 576fa5963cSCheng-Yi Chiang 58efc9194bSKuninori Morimoto struct hdmi_codec_pdata; 5909184118SJyri Sarha struct hdmi_codec_ops { 6009184118SJyri Sarha /* 6109184118SJyri Sarha * Called when ASoC starts an audio stream setup. 6209184118SJyri Sarha * Optional 6309184118SJyri Sarha */ 64efc9194bSKuninori Morimoto int (*audio_startup)(struct device *dev, void *data); 6509184118SJyri Sarha 6609184118SJyri Sarha /* 6709184118SJyri Sarha * Configures HDMI-encoder for audio stream. 682fef64eeSMaxime Ripard * Having either prepare or hw_params is mandatory. 6909184118SJyri Sarha */ 70efc9194bSKuninori Morimoto int (*hw_params)(struct device *dev, void *data, 7109184118SJyri Sarha struct hdmi_codec_daifmt *fmt, 7209184118SJyri Sarha struct hdmi_codec_params *hparms); 7309184118SJyri Sarha 7409184118SJyri Sarha /* 752fef64eeSMaxime Ripard * Configures HDMI-encoder for audio stream. Can be called 762fef64eeSMaxime Ripard * multiple times for each setup. 772fef64eeSMaxime Ripard * 782fef64eeSMaxime Ripard * Having either prepare or hw_params is mandatory. 792fef64eeSMaxime Ripard */ 802fef64eeSMaxime Ripard int (*prepare)(struct device *dev, void *data, 812fef64eeSMaxime Ripard struct hdmi_codec_daifmt *fmt, 822fef64eeSMaxime Ripard struct hdmi_codec_params *hparms); 832fef64eeSMaxime Ripard 842fef64eeSMaxime Ripard /* 8509184118SJyri Sarha * Shuts down the audio stream. 8609184118SJyri Sarha * Mandatory 8709184118SJyri Sarha */ 88efc9194bSKuninori Morimoto void (*audio_shutdown)(struct device *dev, void *data); 8909184118SJyri Sarha 9009184118SJyri Sarha /* 9109184118SJyri Sarha * Mute/unmute HDMI audio stream. 9209184118SJyri Sarha * Optional 9309184118SJyri Sarha */ 94d789710fSKuninori Morimoto int (*mute_stream)(struct device *dev, void *data, 95d789710fSKuninori Morimoto bool enable, int direction); 9609184118SJyri Sarha 9709184118SJyri Sarha /* 9809184118SJyri Sarha * Provides EDID-Like-Data from connected HDMI device. 9909184118SJyri Sarha * Optional 10009184118SJyri Sarha */ 101efc9194bSKuninori Morimoto int (*get_eld)(struct device *dev, void *data, 102efc9194bSKuninori Morimoto uint8_t *buf, size_t len); 10396203fb4SKuninori Morimoto 10496203fb4SKuninori Morimoto /* 10596203fb4SKuninori Morimoto * Getting DAI ID 10696203fb4SKuninori Morimoto * Optional 10796203fb4SKuninori Morimoto */ 10896203fb4SKuninori Morimoto int (*get_dai_id)(struct snd_soc_component *comment, 10996203fb4SKuninori Morimoto struct device_node *endpoint); 1106fa5963cSCheng-Yi Chiang 1116fa5963cSCheng-Yi Chiang /* 1126fa5963cSCheng-Yi Chiang * Hook callback function to handle connector plug event. 1136fa5963cSCheng-Yi Chiang * Optional 1146fa5963cSCheng-Yi Chiang */ 1156fa5963cSCheng-Yi Chiang int (*hook_plugged_cb)(struct device *dev, void *data, 1166fa5963cSCheng-Yi Chiang hdmi_codec_plugged_cb fn, 1176fa5963cSCheng-Yi Chiang struct device *codec_dev); 118d789710fSKuninori Morimoto 119d789710fSKuninori Morimoto /* bit field */ 120d789710fSKuninori Morimoto unsigned int no_capture_mute:1; 12109184118SJyri Sarha }; 12209184118SJyri Sarha 12309184118SJyri Sarha /* HDMI codec initalization data */ 12409184118SJyri Sarha struct hdmi_codec_pdata { 12509184118SJyri Sarha const struct hdmi_codec_ops *ops; 12609184118SJyri Sarha uint i2s:1; 127*f77a066fSMark Brown uint no_i2s_playback:1; 128*f77a066fSMark Brown uint no_i2s_capture:1; 12909184118SJyri Sarha uint spdif:1; 130*f77a066fSMark Brown uint no_spdif_playback:1; 131*f77a066fSMark Brown uint no_spdif_capture:1; 13209184118SJyri Sarha int max_i2s_channels; 133efc9194bSKuninori Morimoto void *data; 13409184118SJyri Sarha }; 13509184118SJyri Sarha 1366fa5963cSCheng-Yi Chiang struct snd_soc_component; 1376fa5963cSCheng-Yi Chiang struct snd_soc_jack; 1386fa5963cSCheng-Yi Chiang 13909184118SJyri Sarha #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec" 14009184118SJyri Sarha 14109184118SJyri Sarha #endif /* __HDMI_CODEC_H__ */ 142