15dab11d8SJerome Anand /* 25dab11d8SJerome Anand * Copyright (C) 2016 Intel Corporation 35dab11d8SJerome Anand * Authors: Sailaja Bandarupalli <sailaja.bandarupalli@intel.com> 45dab11d8SJerome Anand * Ramesh Babu K V <ramesh.babu@intel.com> 55dab11d8SJerome Anand * Vaibhav Agarwal <vaibhav.agarwal@intel.com> 65dab11d8SJerome Anand * Jerome Anand <jerome.anand@intel.com> 75dab11d8SJerome Anand * 85dab11d8SJerome Anand * Permission is hereby granted, free of charge, to any person obtaining 95dab11d8SJerome Anand * a copy of this software and associated documentation files 105dab11d8SJerome Anand * (the "Software"), to deal in the Software without restriction, 115dab11d8SJerome Anand * including without limitation the rights to use, copy, modify, merge, 125dab11d8SJerome Anand * publish, distribute, sublicense, and/or sell copies of the Software, 135dab11d8SJerome Anand * and to permit persons to whom the Software is furnished to do so, 145dab11d8SJerome Anand * subject to the following conditions: 155dab11d8SJerome Anand * 165dab11d8SJerome Anand * The above copyright notice and this permission notice (including the 175dab11d8SJerome Anand * next paragraph) shall be included in all copies or substantial 185dab11d8SJerome Anand * portions of the Software. 195dab11d8SJerome Anand * 205dab11d8SJerome Anand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 215dab11d8SJerome Anand * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 225dab11d8SJerome Anand * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 235dab11d8SJerome Anand * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 245dab11d8SJerome Anand * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 255dab11d8SJerome Anand * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 265dab11d8SJerome Anand * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 275dab11d8SJerome Anand * SOFTWARE. 285dab11d8SJerome Anand */ 295dab11d8SJerome Anand 305dab11d8SJerome Anand #ifndef _INTEL_HDMI_AUDIO_H_ 315dab11d8SJerome Anand #define _INTEL_HDMI_AUDIO_H_ 325dab11d8SJerome Anand 335dab11d8SJerome Anand #include <linux/types.h> 345dab11d8SJerome Anand #include <sound/initval.h> 355dab11d8SJerome Anand #include <linux/version.h> 365dab11d8SJerome Anand #include <linux/pm_runtime.h> 375dab11d8SJerome Anand #include <sound/asoundef.h> 385dab11d8SJerome Anand #include <sound/control.h> 395dab11d8SJerome Anand #include <sound/pcm.h> 405dab11d8SJerome Anand #include "intel_hdmi_lpe_audio.h" 415dab11d8SJerome Anand 425dab11d8SJerome Anand #define PCM_INDEX 0 435dab11d8SJerome Anand #define MAX_PB_STREAMS 1 445dab11d8SJerome Anand #define MAX_CAP_STREAMS 0 455dab11d8SJerome Anand #define HDMI_AUDIO_DRIVER "hdmi-audio" 465dab11d8SJerome Anand 47964ca808SPierre-Louis Bossart #define HDMI_INFO_FRAME_WORD1 0x000a0184 48964ca808SPierre-Louis Bossart #define DP_INFO_FRAME_WORD1 0x00441b84 495dab11d8SJerome Anand #define FIFO_THRESHOLD 0xFE 505dab11d8SJerome Anand #define DMA_FIFO_THRESHOLD 0x7 515dab11d8SJerome Anand #define BYTES_PER_WORD 0x4 525dab11d8SJerome Anand 535dab11d8SJerome Anand /* Sampling rate as per IEC60958 Ver 3 */ 545dab11d8SJerome Anand #define CH_STATUS_MAP_32KHZ 0x3 555dab11d8SJerome Anand #define CH_STATUS_MAP_44KHZ 0x0 565dab11d8SJerome Anand #define CH_STATUS_MAP_48KHZ 0x2 575dab11d8SJerome Anand #define CH_STATUS_MAP_88KHZ 0x8 585dab11d8SJerome Anand #define CH_STATUS_MAP_96KHZ 0xA 595dab11d8SJerome Anand #define CH_STATUS_MAP_176KHZ 0xC 605dab11d8SJerome Anand #define CH_STATUS_MAP_192KHZ 0xE 615dab11d8SJerome Anand 625dab11d8SJerome Anand #define MAX_SMPL_WIDTH_20 0x0 635dab11d8SJerome Anand #define MAX_SMPL_WIDTH_24 0x1 645dab11d8SJerome Anand #define SMPL_WIDTH_16BITS 0x1 655dab11d8SJerome Anand #define SMPL_WIDTH_24BITS 0x5 665dab11d8SJerome Anand #define CHANNEL_ALLOCATION 0x1F 675dab11d8SJerome Anand #define MASK_BYTE0 0x000000FF 685dab11d8SJerome Anand #define VALID_DIP_WORDS 3 695dab11d8SJerome Anand #define LAYOUT0 0 705dab11d8SJerome Anand #define LAYOUT1 1 715dab11d8SJerome Anand #define SWAP_LFE_CENTER 0x00fac4c8 724151ee84STakashi Iwai #define AUD_CONFIG_CH_MASK 0x70 735dab11d8SJerome Anand 745dab11d8SJerome Anand struct pcm_stream_info { 75*313d9f28STakashi Iwai struct snd_pcm_substream *substream; 765dab11d8SJerome Anand u64 buffer_rendered; 775dab11d8SJerome Anand u32 ring_buf_size; 78*313d9f28STakashi Iwai int substream_refcount; 795dab11d8SJerome Anand }; 805dab11d8SJerome Anand 815dab11d8SJerome Anand struct ring_buf_info { 825dab11d8SJerome Anand u32 buf_addr; 835dab11d8SJerome Anand u32 buf_size; 845dab11d8SJerome Anand u8 is_valid; 855dab11d8SJerome Anand }; 865dab11d8SJerome Anand 875647aec2STakashi Iwai struct had_stream_data { 885dab11d8SJerome Anand enum had_status_stream stream_type; 895dab11d8SJerome Anand }; 905dab11d8SJerome Anand 915dab11d8SJerome Anand /** 925dab11d8SJerome Anand * struct snd_intelhad - intelhad driver structure 935dab11d8SJerome Anand * 945dab11d8SJerome Anand * @card: ptr to hold card details 955dab11d8SJerome Anand * @drv_status: driver status 965dab11d8SJerome Anand * @buf_info: ring buffer info 975dab11d8SJerome Anand * @stream_info: stream information 98da864809STakashi Iwai * @eld: holds ELD info 995dab11d8SJerome Anand * @curr_buf: pointer to hold current active ring buf 1005dab11d8SJerome Anand * @valid_buf_cnt: ring buffer count for stream 1015dab11d8SJerome Anand * @had_spinlock: driver lock 1025dab11d8SJerome Anand * @aes_bits: IEC958 status bits 1035dab11d8SJerome Anand * @buff_done: id of current buffer done intr 1045dab11d8SJerome Anand * @dev: platoform device handle 1055dab11d8SJerome Anand * @chmap: holds channel map info 1066ddb3ab6STakashi Iwai * @underrun_count: PCM stream underrun counter 1075dab11d8SJerome Anand */ 1085dab11d8SJerome Anand struct snd_intelhad { 1095dab11d8SJerome Anand struct snd_card *card; 1105dab11d8SJerome Anand enum had_drv_status drv_status; 1115dab11d8SJerome Anand struct ring_buf_info buf_info[HAD_NUM_OF_RING_BUFS]; 1125dab11d8SJerome Anand struct pcm_stream_info stream_info; 113da864809STakashi Iwai union otm_hdmi_eld_t eld; 114964ca808SPierre-Louis Bossart bool dp_output; 1155dab11d8SJerome Anand enum intel_had_aud_buf_type curr_buf; 1165dab11d8SJerome Anand int valid_buf_cnt; 1175dab11d8SJerome Anand unsigned int aes_bits; 1185647aec2STakashi Iwai struct had_stream_data stream_data; 1195dab11d8SJerome Anand spinlock_t had_spinlock; 1205dab11d8SJerome Anand enum intel_had_aud_buf_type buff_done; 1215dab11d8SJerome Anand struct device *dev; 1225dab11d8SJerome Anand struct snd_pcm_chmap *chmap; 1236ddb3ab6STakashi Iwai int underrun_count; 124da864809STakashi Iwai int tmds_clock_speed; 125da864809STakashi Iwai int link_rate; 126da864809STakashi Iwai 127da864809STakashi Iwai /* internal stuff */ 128da864809STakashi Iwai int irq; 129da864809STakashi Iwai void __iomem *mmio_start; 130da864809STakashi Iwai unsigned int had_config_offset; 131da864809STakashi Iwai struct work_struct hdmi_audio_wq; 1320e9c67d7STakashi Iwai struct mutex mutex; /* for protecting chmap and eld */ 1335dab11d8SJerome Anand }; 1345dab11d8SJerome Anand 1355dab11d8SJerome Anand #endif /* _INTEL_HDMI_AUDIO_ */ 136