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