forked from Minki/linux
8a2d6ae1f7
Now that everything is in place let's register a PCM device for each port of the display engine. This will make it possible to actually output audio to multiple displays at the same time. And it avoids modesets on unrelated displays from clobbering up the ELD and whatnot for the display currently doing the playback. v2: Add a PCM per port instead of per pipe v3: Fix off by one error with port numbers (Pierre-Louis) Fix .notify_audio_lpe() prototype (Pierre-Louis) Cc: Takashi Iwai <tiwai@suse.de> Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170427160231.13337-12-ville.syrjala@linux.intel.com Reviewed-by: Takashi Iwai <tiwai@suse.de>
147 lines
4.4 KiB
C
147 lines
4.4 KiB
C
/*
|
|
* Copyright (C) 2016 Intel Corporation
|
|
* Authors: Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
|
|
* Ramesh Babu K V <ramesh.babu@intel.com>
|
|
* Vaibhav Agarwal <vaibhav.agarwal@intel.com>
|
|
* Jerome Anand <jerome.anand@intel.com>
|
|
*
|
|
* 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_ */
|