146 lines · c
1/*2 * Copyright (C) 2016 Intel Corporation3 * Authors: Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>4 * Ramesh Babu K V <ramesh.babu@intel.com>5 * Vaibhav Agarwal <vaibhav.agarwal@intel.com>6 * Jerome Anand <jerome.anand@intel.com>7 *8 * Permission is hereby granted, free of charge, to any person obtaining9 * a copy of this software and associated documentation files10 * (the "Software"), to deal in the Software without restriction,11 * including without limitation the rights to use, copy, modify, merge,12 * publish, distribute, sublicense, and/or sell copies of the Software,13 * and to permit persons to whom the Software is furnished to do so,14 * subject to the following conditions:15 *16 * The above copyright notice and this permission notice (including the17 * next paragraph) shall be included in all copies or substantial18 * portions of the Software.19 *20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS24 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN25 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN26 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE27 * SOFTWARE.28 */29 30#ifndef _INTEL_HDMI_AUDIO_H_31#define _INTEL_HDMI_AUDIO_H_32 33#include "intel_hdmi_lpe_audio.h"34 35#define MAX_PB_STREAMS 136#define MAX_CAP_STREAMS 037#define BYTES_PER_WORD 0x438#define INTEL_HAD "HdmiLpeAudio"39 40/*41 * CEA speaker placement:42 *43 * FL FLC FC FRC FR44 *45 * LFE46 *47 * RL RLC RC RRC RR48 *49 * The Left/Right Surround channel _notions_ LS/RS in SMPTE 320M50 * corresponds to CEA RL/RR; The SMPTE channel _assignment_ C/LFE is51 * swapped to CEA LFE/FC.52 */53enum cea_speaker_placement {54 FL = (1 << 0), /* Front Left */55 FC = (1 << 1), /* Front Center */56 FR = (1 << 2), /* Front Right */57 FLC = (1 << 3), /* Front Left Center */58 FRC = (1 << 4), /* Front Right Center */59 RL = (1 << 5), /* Rear Left */60 RC = (1 << 6), /* Rear Center */61 RR = (1 << 7), /* Rear Right */62 RLC = (1 << 8), /* Rear Left Center */63 RRC = (1 << 9), /* Rear Right Center */64 LFE = (1 << 10), /* Low Frequency Effect */65};66 67struct cea_channel_speaker_allocation {68 int ca_index;69 int speakers[8];70 71 /* derived values, just for convenience */72 int channels;73 int spk_mask;74};75 76struct channel_map_table {77 unsigned char map; /* ALSA API channel map position */78 unsigned char cea_slot; /* CEA slot value */79 int spk_mask; /* speaker position bit mask */80};81 82struct pcm_stream_info {83 struct snd_pcm_substream *substream;84 int substream_refcount;85};86 87/*88 * struct snd_intelhad - intelhad driver structure89 *90 * @card: ptr to hold card details91 * @connected: the monitor connection status92 * @stream_info: stream information93 * @eld: holds ELD info94 * @curr_buf: pointer to hold current active ring buf95 * @valid_buf_cnt: ring buffer count for stream96 * @had_spinlock: driver lock97 * @aes_bits: IEC958 status bits98 * @buff_done: id of current buffer done intr99 * @dev: platform device handle100 * @chmap: holds channel map info101 */102struct snd_intelhad {103 struct snd_intelhad_card *card_ctx;104 bool connected;105 struct pcm_stream_info stream_info;106 unsigned char eld[HDMI_MAX_ELD_BYTES];107 bool dp_output;108 unsigned int aes_bits;109 spinlock_t had_spinlock;110 struct device *dev;111 struct snd_pcm_chmap *chmap;112 int tmds_clock_speed;113 int link_rate;114 int port; /* fixed */115 int pipe; /* can change dynamically */116 117 /* ring buffer (BD) position index */118 unsigned int bd_head;119 /* PCM buffer position indices */120 unsigned int pcmbuf_head; /* being processed */121 unsigned int pcmbuf_filled; /* to be filled */122 123 unsigned int num_bds; /* number of BDs */124 unsigned int period_bytes; /* PCM period size in bytes */125 126 /* internal stuff */127 union aud_cfg aud_config; /* AUD_CONFIG reg value cache */128 struct work_struct hdmi_audio_wq;129 struct mutex mutex; /* for protecting chmap and eld */130 struct snd_jack *jack;131};132 133struct snd_intelhad_card {134 struct snd_card *card;135 struct device *dev;136 137 /* internal stuff */138 int irq;139 void __iomem *mmio_start;140 int num_pipes;141 int num_ports;142 struct snd_intelhad pcm_ctx[3]; /* one for each port */143};144 145#endif /* _INTEL_HDMI_AUDIO_ */146