/* * Copyright (C) 2016 Intel Corporation * Authors: Sailaja Bandarupalli * Ramesh Babu K V * Vaibhav Agarwal * Jerome Anand * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef _INTEL_HDMI_AUDIO_H_ #define _INTEL_HDMI_AUDIO_H_ #include "intel_hdmi_lpe_audio.h" #define MAX_PB_STREAMS 1 #define MAX_CAP_STREAMS 0 #define BYTES_PER_WORD 0x4 #define INTEL_HAD "HdmiLpeAudio" /* * CEA speaker placement: * * FL FLC FC FRC FR * * LFE * * RL RLC RC RRC RR * * The Left/Right Surround channel _notions_ LS/RS in SMPTE 320M * corresponds to CEA RL/RR; The SMPTE channel _assignment_ C/LFE is * swapped to CEA LFE/FC. */ enum cea_speaker_placement { FL = (1 << 0), /* Front Left */ FC = (1 << 1), /* Front Center */ FR = (1 << 2), /* Front Right */ FLC = (1 << 3), /* Front Left Center */ FRC = (1 << 4), /* Front Right Center */ RL = (1 << 5), /* Rear Left */ RC = (1 << 6), /* Rear Center */ RR = (1 << 7), /* Rear Right */ RLC = (1 << 8), /* Rear Left Center */ RRC = (1 << 9), /* Rear Right Center */ LFE = (1 << 10), /* Low Frequency Effect */ }; struct cea_channel_speaker_allocation { int ca_index; int speakers[8]; /* derived values, just for convenience */ int channels; int spk_mask; }; struct channel_map_table { unsigned char map; /* ALSA API channel map position */ unsigned char cea_slot; /* CEA slot value */ int spk_mask; /* speaker position bit mask */ }; struct pcm_stream_info { struct snd_pcm_substream *substream; int substream_refcount; }; /* * struct snd_intelhad - intelhad driver structure * * @card: ptr to hold card details * @connected: the monitor connection status * @stream_info: stream information * @eld: holds ELD info * @curr_buf: pointer to hold current active ring buf * @valid_buf_cnt: ring buffer count for stream * @had_spinlock: driver lock * @aes_bits: IEC958 status bits * @buff_done: id of current buffer done intr * @dev: platoform device handle * @chmap: holds channel map info */ struct snd_intelhad { struct snd_intelhad_card *card_ctx; bool connected; struct pcm_stream_info stream_info; unsigned char eld[HDMI_MAX_ELD_BYTES]; bool dp_output; unsigned int aes_bits; spinlock_t had_spinlock; struct device *dev; struct snd_pcm_chmap *chmap; int tmds_clock_speed; int link_rate; int port; /* fixed */ int pipe; /* can change dynamically */ /* ring buffer (BD) position index */ unsigned int bd_head; /* PCM buffer position indices */ unsigned int pcmbuf_head; /* being processed */ unsigned int pcmbuf_filled; /* to be filled */ unsigned int num_bds; /* number of BDs */ unsigned int period_bytes; /* PCM period size in bytes */ /* internal stuff */ union aud_cfg aud_config; /* AUD_CONFIG reg value cache */ struct work_struct hdmi_audio_wq; struct mutex mutex; /* for protecting chmap and eld */ bool need_reset; struct snd_jack *jack; }; struct snd_intelhad_card { struct snd_card *card; struct device *dev; /* internal stuff */ int irq; void __iomem *mmio_start; int num_pipes; int num_ports; struct snd_intelhad pcm_ctx[3]; /* one for each port */ }; #endif /* _INTEL_HDMI_AUDIO_ */