Loading drivers/gpu/drm/i915/i915_reg.h +3 −0 Original line number Diff line number Diff line Loading @@ -2062,6 +2062,9 @@ enum skl_disp_power_wells { #define I915_HDMI_LPE_AUDIO_SIZE 0x1000 /* DisplayPort Audio w/ LPE */ #define VLV_AUD_CHICKEN_BIT_REG _MMIO(VLV_DISPLAY_BASE + 0x62F38) #define VLV_CHICKEN_BIT_DBG_ENABLE (1 << 0) #define _VLV_AUD_PORT_EN_B_DBG (VLV_DISPLAY_BASE + 0x62F20) #define _VLV_AUD_PORT_EN_C_DBG (VLV_DISPLAY_BASE + 0x62F30) #define _VLV_AUD_PORT_EN_D_DBG (VLV_DISPLAY_BASE + 0x62F34) Loading drivers/gpu/drm/i915/intel_lpe_audio.c +5 −0 Original line number Diff line number Diff line Loading @@ -248,6 +248,11 @@ static int lpe_audio_setup(struct drm_i915_private *dev_priv) goto err_free_irq; } /* enable chicken bit; at least this is required for Dell Wyse 3040 * with DP outputs (but only sometimes by some reason!) */ I915_WRITE(VLV_AUD_CHICKEN_BIT_REG, VLV_CHICKEN_BIT_DBG_ENABLE); return 0; err_free_irq: irq_free_desc(dev_priv->lpe_audio.irq); Loading sound/x86/Makefile +1 −3 Original line number Diff line number Diff line snd-hdmi-lpe-audio-objs += \ intel_hdmi_audio.o \ intel_hdmi_audio_if.o \ intel_hdmi_lpe_audio.o intel_hdmi_audio.o obj-$(CONFIG_HDMI_LPE_AUDIO) += snd-hdmi-lpe-audio.o sound/x86/intel_hdmi_audio.c +951 −950 File changed.Preview size limit exceeded, changes collapsed. Show changes sound/x86/intel_hdmi_audio.h +20 −97 Original line number Diff line number Diff line Loading @@ -30,19 +30,11 @@ #ifndef _INTEL_HDMI_AUDIO_H_ #define _INTEL_HDMI_AUDIO_H_ #include <linux/types.h> #include <sound/initval.h> #include <linux/version.h> #include <linux/pm_runtime.h> #include <sound/asoundef.h> #include <sound/control.h> #include <sound/pcm.h> #include "intel_hdmi_lpe_audio.h" #define PCM_INDEX 0 #define MAX_PB_STREAMS 1 #define MAX_CAP_STREAMS 0 #define HDMI_AUDIO_DRIVER "hdmi-audio" #define HDMI_INFO_FRAME_WORD1 0x000a0184 #define DP_INFO_FRAME_WORD1 0x00441b84 Loading @@ -64,21 +56,18 @@ #define SMPL_WIDTH_16BITS 0x1 #define SMPL_WIDTH_24BITS 0x5 #define CHANNEL_ALLOCATION 0x1F #define MASK_BYTE0 0x000000FF #define VALID_DIP_WORDS 3 #define LAYOUT0 0 #define LAYOUT1 1 #define SWAP_LFE_CENTER 0x00fac4c8 #define AUD_CONFIG_CH_MASK_V2 0x70 #define AUD_CONFIG_CH_MASK 0x70 struct pcm_stream_info { int str_id; void *had_substream; void (*period_elapsed)(void *had_substream); u32 buffer_ptr; struct snd_pcm_substream *substream; u64 buffer_rendered; u32 ring_buf_size; int sfreq; int substream_refcount; bool running; }; struct ring_buf_info { Loading @@ -87,113 +76,47 @@ struct ring_buf_info { u8 is_valid; }; struct had_stream_pvt { enum had_stream_status stream_status; int stream_ops; ssize_t dbg_cum_bytes; }; struct had_pvt_data { enum had_status_stream stream_type; }; struct had_callback_ops { had_event_call_back intel_had_event_call_back; }; /** /* * struct snd_intelhad - intelhad driver structure * * @card: ptr to hold card details * @card_index: sound card index * @card_id: detected sound card id * @reg_ops: register operations to program registers * @query_ops: caps call backs for get/set operations * @drv_status: driver status * @connected: the monitor connection status * @buf_info: ring buffer info * @stream_info: stream information * @eeld: holds EELD info * @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 * @kctl: holds kctl ptrs used for channel map * @chmap: holds channel map info * @audio_reg_base: hdmi audio register base offset * @hw_silence: flag indicates SoC support for HW silence/Keep alive * @ops: holds ops functions based on platform * @underrun_count: PCM stream underrun counter */ struct snd_intelhad { struct snd_card *card; int card_index; char *card_id; struct hdmi_audio_registers_ops reg_ops; struct hdmi_audio_query_set_ops query_ops; enum had_drv_status drv_status; bool connected; struct ring_buf_info buf_info[HAD_NUM_OF_RING_BUFS]; struct pcm_stream_info stream_info; union otm_hdmi_eld_t eeld; unsigned char eld[HDMI_MAX_ELD_BYTES]; bool dp_output; enum intel_had_aud_buf_type curr_buf; int valid_buf_cnt; unsigned int aes_bits; int flag_underrun; struct had_pvt_data *private_data; spinlock_t had_spinlock; enum intel_had_aud_buf_type buff_done; struct device *dev; struct snd_kcontrol *kctl; struct snd_pcm_chmap *chmap; unsigned int *audio_reg_base; unsigned int audio_cfg_offset; bool hw_silence; struct had_ops *ops; int underrun_count; int tmds_clock_speed; int link_rate; /* internal stuff */ int irq; void __iomem *mmio_start; unsigned int had_config_offset; struct work_struct hdmi_audio_wq; struct mutex mutex; /* for protecting chmap and eld */ }; struct had_ops { void (*enable_audio)(struct snd_pcm_substream *substream, u8 enable); void (*reset_audio)(u8 reset); int (*prog_n)(u32 aud_samp_freq, u32 *n_param, struct snd_intelhad *intelhaddata); void (*prog_cts)(u32 aud_samp_freq, u32 tmds, u32 link_rate, u32 n_param, struct snd_intelhad *intelhaddata); int (*audio_ctrl)(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata); void (*prog_dip)(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata); void (*handle_underrun)(struct snd_intelhad *intelhaddata); }; int had_event_handler(enum had_event_type event_type, void *data); int hdmi_audio_query(void *drv_data, struct hdmi_audio_event event); int hdmi_audio_suspend(void *drv_data, struct hdmi_audio_event event); int hdmi_audio_resume(void *drv_data); int hdmi_audio_mode_change(struct snd_pcm_substream *substream); extern struct snd_pcm_ops snd_intelhad_playback_ops; int snd_intelhad_init_audio_ctrl(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata, int flag_silence); int snd_intelhad_prog_buffer(struct snd_intelhad *intelhaddata, int start, int end); int snd_intelhad_invd_buffer(int start, int end); int snd_intelhad_read_len(struct snd_intelhad *intelhaddata); void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata); /* Register access functions */ int had_get_hwstate(struct snd_intelhad *intelhaddata); int had_get_caps(enum had_caps_list query_element, void *capabilties); int had_set_caps(enum had_caps_list set_element, void *capabilties); int had_read_register(u32 reg_addr, u32 *data); int had_write_register(u32 reg_addr, u32 data); int had_read_modify(u32 reg_addr, u32 data, u32 mask); int hdmi_audio_probe(void *devptr); int hdmi_audio_remove(void *pdev); #endif /* _INTEL_HDMI_AUDIO_ */ Loading
drivers/gpu/drm/i915/i915_reg.h +3 −0 Original line number Diff line number Diff line Loading @@ -2062,6 +2062,9 @@ enum skl_disp_power_wells { #define I915_HDMI_LPE_AUDIO_SIZE 0x1000 /* DisplayPort Audio w/ LPE */ #define VLV_AUD_CHICKEN_BIT_REG _MMIO(VLV_DISPLAY_BASE + 0x62F38) #define VLV_CHICKEN_BIT_DBG_ENABLE (1 << 0) #define _VLV_AUD_PORT_EN_B_DBG (VLV_DISPLAY_BASE + 0x62F20) #define _VLV_AUD_PORT_EN_C_DBG (VLV_DISPLAY_BASE + 0x62F30) #define _VLV_AUD_PORT_EN_D_DBG (VLV_DISPLAY_BASE + 0x62F34) Loading
drivers/gpu/drm/i915/intel_lpe_audio.c +5 −0 Original line number Diff line number Diff line Loading @@ -248,6 +248,11 @@ static int lpe_audio_setup(struct drm_i915_private *dev_priv) goto err_free_irq; } /* enable chicken bit; at least this is required for Dell Wyse 3040 * with DP outputs (but only sometimes by some reason!) */ I915_WRITE(VLV_AUD_CHICKEN_BIT_REG, VLV_CHICKEN_BIT_DBG_ENABLE); return 0; err_free_irq: irq_free_desc(dev_priv->lpe_audio.irq); Loading
sound/x86/Makefile +1 −3 Original line number Diff line number Diff line snd-hdmi-lpe-audio-objs += \ intel_hdmi_audio.o \ intel_hdmi_audio_if.o \ intel_hdmi_lpe_audio.o intel_hdmi_audio.o obj-$(CONFIG_HDMI_LPE_AUDIO) += snd-hdmi-lpe-audio.o
sound/x86/intel_hdmi_audio.c +951 −950 File changed.Preview size limit exceeded, changes collapsed. Show changes
sound/x86/intel_hdmi_audio.h +20 −97 Original line number Diff line number Diff line Loading @@ -30,19 +30,11 @@ #ifndef _INTEL_HDMI_AUDIO_H_ #define _INTEL_HDMI_AUDIO_H_ #include <linux/types.h> #include <sound/initval.h> #include <linux/version.h> #include <linux/pm_runtime.h> #include <sound/asoundef.h> #include <sound/control.h> #include <sound/pcm.h> #include "intel_hdmi_lpe_audio.h" #define PCM_INDEX 0 #define MAX_PB_STREAMS 1 #define MAX_CAP_STREAMS 0 #define HDMI_AUDIO_DRIVER "hdmi-audio" #define HDMI_INFO_FRAME_WORD1 0x000a0184 #define DP_INFO_FRAME_WORD1 0x00441b84 Loading @@ -64,21 +56,18 @@ #define SMPL_WIDTH_16BITS 0x1 #define SMPL_WIDTH_24BITS 0x5 #define CHANNEL_ALLOCATION 0x1F #define MASK_BYTE0 0x000000FF #define VALID_DIP_WORDS 3 #define LAYOUT0 0 #define LAYOUT1 1 #define SWAP_LFE_CENTER 0x00fac4c8 #define AUD_CONFIG_CH_MASK_V2 0x70 #define AUD_CONFIG_CH_MASK 0x70 struct pcm_stream_info { int str_id; void *had_substream; void (*period_elapsed)(void *had_substream); u32 buffer_ptr; struct snd_pcm_substream *substream; u64 buffer_rendered; u32 ring_buf_size; int sfreq; int substream_refcount; bool running; }; struct ring_buf_info { Loading @@ -87,113 +76,47 @@ struct ring_buf_info { u8 is_valid; }; struct had_stream_pvt { enum had_stream_status stream_status; int stream_ops; ssize_t dbg_cum_bytes; }; struct had_pvt_data { enum had_status_stream stream_type; }; struct had_callback_ops { had_event_call_back intel_had_event_call_back; }; /** /* * struct snd_intelhad - intelhad driver structure * * @card: ptr to hold card details * @card_index: sound card index * @card_id: detected sound card id * @reg_ops: register operations to program registers * @query_ops: caps call backs for get/set operations * @drv_status: driver status * @connected: the monitor connection status * @buf_info: ring buffer info * @stream_info: stream information * @eeld: holds EELD info * @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 * @kctl: holds kctl ptrs used for channel map * @chmap: holds channel map info * @audio_reg_base: hdmi audio register base offset * @hw_silence: flag indicates SoC support for HW silence/Keep alive * @ops: holds ops functions based on platform * @underrun_count: PCM stream underrun counter */ struct snd_intelhad { struct snd_card *card; int card_index; char *card_id; struct hdmi_audio_registers_ops reg_ops; struct hdmi_audio_query_set_ops query_ops; enum had_drv_status drv_status; bool connected; struct ring_buf_info buf_info[HAD_NUM_OF_RING_BUFS]; struct pcm_stream_info stream_info; union otm_hdmi_eld_t eeld; unsigned char eld[HDMI_MAX_ELD_BYTES]; bool dp_output; enum intel_had_aud_buf_type curr_buf; int valid_buf_cnt; unsigned int aes_bits; int flag_underrun; struct had_pvt_data *private_data; spinlock_t had_spinlock; enum intel_had_aud_buf_type buff_done; struct device *dev; struct snd_kcontrol *kctl; struct snd_pcm_chmap *chmap; unsigned int *audio_reg_base; unsigned int audio_cfg_offset; bool hw_silence; struct had_ops *ops; int underrun_count; int tmds_clock_speed; int link_rate; /* internal stuff */ int irq; void __iomem *mmio_start; unsigned int had_config_offset; struct work_struct hdmi_audio_wq; struct mutex mutex; /* for protecting chmap and eld */ }; struct had_ops { void (*enable_audio)(struct snd_pcm_substream *substream, u8 enable); void (*reset_audio)(u8 reset); int (*prog_n)(u32 aud_samp_freq, u32 *n_param, struct snd_intelhad *intelhaddata); void (*prog_cts)(u32 aud_samp_freq, u32 tmds, u32 link_rate, u32 n_param, struct snd_intelhad *intelhaddata); int (*audio_ctrl)(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata); void (*prog_dip)(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata); void (*handle_underrun)(struct snd_intelhad *intelhaddata); }; int had_event_handler(enum had_event_type event_type, void *data); int hdmi_audio_query(void *drv_data, struct hdmi_audio_event event); int hdmi_audio_suspend(void *drv_data, struct hdmi_audio_event event); int hdmi_audio_resume(void *drv_data); int hdmi_audio_mode_change(struct snd_pcm_substream *substream); extern struct snd_pcm_ops snd_intelhad_playback_ops; int snd_intelhad_init_audio_ctrl(struct snd_pcm_substream *substream, struct snd_intelhad *intelhaddata, int flag_silence); int snd_intelhad_prog_buffer(struct snd_intelhad *intelhaddata, int start, int end); int snd_intelhad_invd_buffer(int start, int end); int snd_intelhad_read_len(struct snd_intelhad *intelhaddata); void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata); /* Register access functions */ int had_get_hwstate(struct snd_intelhad *intelhaddata); int had_get_caps(enum had_caps_list query_element, void *capabilties); int had_set_caps(enum had_caps_list set_element, void *capabilties); int had_read_register(u32 reg_addr, u32 *data); int had_write_register(u32 reg_addr, u32 data); int had_read_modify(u32 reg_addr, u32 data, u32 mask); int hdmi_audio_probe(void *devptr); int hdmi_audio_remove(void *pdev); #endif /* _INTEL_HDMI_AUDIO_ */