Loading MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -8044,6 +8044,7 @@ S: Maintained F: drivers/video/fbdev/i810/ INTEL ASoC DRIVERS M: Cezary Rojewski <cezary.rojewski@intel.com> M: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> M: Liam Girdwood <liam.r.girdwood@linux.intel.com> M: Jie Yang <yang.jie@linux.intel.com> Loading sound/soc/amd/raven/acp3x-pcm-dma.c +9 −11 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ struct i2s_stream_instance { u16 num_pages; u16 channels; u32 xfer_resolution; struct page *pg; u64 bytescount; dma_addr_t dma_addr; void __iomem *acp3x_base; }; Loading Loading @@ -211,9 +211,8 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id) static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) { u16 page_idx; u64 addr; u32 low, high, val, acp_fifo_addr; struct page *pg = rtd->pg; dma_addr_t addr = rtd->dma_addr; /* 8 scratch registers used to map one 64 bit address */ if (direction == SNDRV_PCM_STREAM_PLAYBACK) Loading @@ -229,7 +228,6 @@ static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) for (page_idx = 0; page_idx < rtd->num_pages; page_idx++) { /* Load the low address of page int ACP SRAM through SRBM */ addr = page_to_phys(pg); low = lower_32_bits(addr); high = upper_32_bits(addr); Loading @@ -239,7 +237,7 @@ static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) + 4); /* Move to next physically contiguos page */ val += 8; pg++; addr += PAGE_SIZE; } if (direction == SNDRV_PCM_STREAM_PLAYBACK) { Loading Loading @@ -341,7 +339,6 @@ static int acp3x_dma_hw_params(struct snd_pcm_substream *substream, { int status; u64 size; struct page *pg; struct snd_pcm_runtime *runtime = substream->runtime; struct i2s_stream_instance *rtd = runtime->private_data; Loading @@ -354,9 +351,8 @@ static int acp3x_dma_hw_params(struct snd_pcm_substream *substream, return status; memset(substream->runtime->dma_area, 0, params_buffer_bytes(params)); pg = virt_to_page(substream->dma_buffer.area); if (pg) { rtd->pg = pg; if (substream->dma_buffer.area) { rtd->dma_addr = substream->dma_buffer.addr; rtd->num_pages = (PAGE_ALIGN(size) >> PAGE_SHIFT); config_acp3x_dma(rtd, substream->stream); status = 0; Loading Loading @@ -385,9 +381,11 @@ static snd_pcm_uframes_t acp3x_dma_pointer(struct snd_pcm_substream *substream) static int acp3x_dma_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct device *parent = component->dev->parent; snd_pcm_lib_preallocate_pages_for_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, rtd->pcm->card->dev, MIN_BUFFER, MAX_BUFFER); parent, MIN_BUFFER, MAX_BUFFER); return 0; } Loading sound/soc/codecs/hdac_hda.c +4 −0 Original line number Diff line number Diff line Loading @@ -495,6 +495,10 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev) static int hdac_hda_dev_remove(struct hdac_device *hdev) { struct hdac_hda_priv *hda_pvt; hda_pvt = dev_get_drvdata(&hdev->dev); cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); return 0; } Loading sound/soc/codecs/hdac_hdmi.c +48 −9 Original line number Diff line number Diff line Loading @@ -88,8 +88,10 @@ struct hdac_hdmi_port { hda_nid_t mux_nids[HDA_MAX_CONNECTIONS]; struct hdac_hdmi_eld eld; const char *jack_pin; bool is_connect; struct snd_soc_dapm_context *dapm; const char *output_pin; struct work_struct dapm_work; }; struct hdac_hdmi_pcm { Loading Loading @@ -163,11 +165,7 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm, { struct hdac_device *hdev = port->pin->hdev; if (is_connect) snd_soc_dapm_enable_pin(port->dapm, port->jack_pin); else snd_soc_dapm_disable_pin(port->dapm, port->jack_pin); port->is_connect = is_connect; if (is_connect) { /* * Report Jack connect event when a device is connected Loading @@ -193,10 +191,32 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm, if (pcm->jack_event > 0) pcm->jack_event--; } } static void hdac_hdmi_port_dapm_update(struct hdac_hdmi_port *port) { if (port->is_connect) snd_soc_dapm_enable_pin(port->dapm, port->jack_pin); else snd_soc_dapm_disable_pin(port->dapm, port->jack_pin); snd_soc_dapm_sync(port->dapm); } static void hdac_hdmi_jack_dapm_work(struct work_struct *work) { struct hdac_hdmi_port *port; port = container_of(work, struct hdac_hdmi_port, dapm_work); hdac_hdmi_port_dapm_update(port); } static void hdac_hdmi_jack_report_sync(struct hdac_hdmi_pcm *pcm, struct hdac_hdmi_port *port, bool is_connect) { hdac_hdmi_jack_report(pcm, port, is_connect); hdac_hdmi_port_dapm_update(port); } /* MST supported verbs */ /* * Get the no devices that can be connected to a port on the Pin widget. Loading Loading @@ -904,7 +924,7 @@ static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol *kcontrol, list_for_each_entry_safe(p, p_next, &pcm->port_list, head) { if (p == port && p->id == port->id && p->pin == port->pin) { hdac_hdmi_jack_report(pcm, port, false); hdac_hdmi_jack_report_sync(pcm, port, false); list_del(&p->head); } } Loading @@ -918,7 +938,7 @@ static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol *kcontrol, if (!strcmp(cvt_name, pcm->cvt->name)) { list_add_tail(&port->head, &pcm->port_list); if (port->eld.monitor_present && port->eld.eld_valid) { hdac_hdmi_jack_report(pcm, port, true); hdac_hdmi_jack_report_sync(pcm, port, true); mutex_unlock(&hdmi->pin_mutex); return ret; } Loading Loading @@ -1281,16 +1301,20 @@ static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin, * report jack here. It will be done in usermode mux * control select. */ if (pcm) if (pcm) { hdac_hdmi_jack_report(pcm, port, false); schedule_work(&port->dapm_work); } mutex_unlock(&hdmi->pin_mutex); return; } if (port->eld.monitor_present && port->eld.eld_valid) { if (pcm) if (pcm) { hdac_hdmi_jack_report(pcm, port, true); schedule_work(&port->dapm_work); } print_hex_dump_debug("ELD: ", DUMP_PREFIX_OFFSET, 16, 1, port->eld.eld_buffer, port->eld.eld_size, false); Loading Loading @@ -1319,6 +1343,7 @@ static int hdac_hdmi_add_ports(struct hdac_device *hdev, for (i = 0; i < max_ports; i++) { ports[i].id = i; ports[i].pin = pin; INIT_WORK(&ports[i].dapm_work, hdac_hdmi_jack_dapm_work); } pin->ports = ports; pin->num_ports = max_ports; Loading Loading @@ -2083,8 +2108,20 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev) return ret; } static void clear_dapm_works(struct hdac_device *hdev) { struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev); struct hdac_hdmi_pin *pin; int i; list_for_each_entry(pin, &hdmi->pin_list, head) for (i = 0; i < pin->num_ports; i++) cancel_work_sync(&pin->ports[i].dapm_work); } static int hdac_hdmi_dev_remove(struct hdac_device *hdev) { clear_dapm_works(hdev); snd_hdac_display_power(hdev->bus, hdev->addr, false); return 0; Loading @@ -2103,6 +2140,8 @@ static int hdac_hdmi_runtime_suspend(struct device *dev) if (!bus) return 0; clear_dapm_works(hdev); /* * Power down afg. * codec_read is preferred over codec_write to set the power state. Loading sound/soc/codecs/max98373.c +6 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,12 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, case 48000: sampling_rate = MAX98373_PCM_SR_SET1_SR_48000; break; case 88200: sampling_rate = MAX98373_PCM_SR_SET1_SR_88200; break; case 96000: sampling_rate = MAX98373_PCM_SR_SET1_SR_96000; break; default: dev_err(component->dev, "rate %d not supported\n", params_rate(params)); Loading Loading
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -8044,6 +8044,7 @@ S: Maintained F: drivers/video/fbdev/i810/ INTEL ASoC DRIVERS M: Cezary Rojewski <cezary.rojewski@intel.com> M: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> M: Liam Girdwood <liam.r.girdwood@linux.intel.com> M: Jie Yang <yang.jie@linux.intel.com> Loading
sound/soc/amd/raven/acp3x-pcm-dma.c +9 −11 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ struct i2s_stream_instance { u16 num_pages; u16 channels; u32 xfer_resolution; struct page *pg; u64 bytescount; dma_addr_t dma_addr; void __iomem *acp3x_base; }; Loading Loading @@ -211,9 +211,8 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id) static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) { u16 page_idx; u64 addr; u32 low, high, val, acp_fifo_addr; struct page *pg = rtd->pg; dma_addr_t addr = rtd->dma_addr; /* 8 scratch registers used to map one 64 bit address */ if (direction == SNDRV_PCM_STREAM_PLAYBACK) Loading @@ -229,7 +228,6 @@ static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) for (page_idx = 0; page_idx < rtd->num_pages; page_idx++) { /* Load the low address of page int ACP SRAM through SRBM */ addr = page_to_phys(pg); low = lower_32_bits(addr); high = upper_32_bits(addr); Loading @@ -239,7 +237,7 @@ static void config_acp3x_dma(struct i2s_stream_instance *rtd, int direction) + 4); /* Move to next physically contiguos page */ val += 8; pg++; addr += PAGE_SIZE; } if (direction == SNDRV_PCM_STREAM_PLAYBACK) { Loading Loading @@ -341,7 +339,6 @@ static int acp3x_dma_hw_params(struct snd_pcm_substream *substream, { int status; u64 size; struct page *pg; struct snd_pcm_runtime *runtime = substream->runtime; struct i2s_stream_instance *rtd = runtime->private_data; Loading @@ -354,9 +351,8 @@ static int acp3x_dma_hw_params(struct snd_pcm_substream *substream, return status; memset(substream->runtime->dma_area, 0, params_buffer_bytes(params)); pg = virt_to_page(substream->dma_buffer.area); if (pg) { rtd->pg = pg; if (substream->dma_buffer.area) { rtd->dma_addr = substream->dma_buffer.addr; rtd->num_pages = (PAGE_ALIGN(size) >> PAGE_SHIFT); config_acp3x_dma(rtd, substream->stream); status = 0; Loading Loading @@ -385,9 +381,11 @@ static snd_pcm_uframes_t acp3x_dma_pointer(struct snd_pcm_substream *substream) static int acp3x_dma_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, DRV_NAME); struct device *parent = component->dev->parent; snd_pcm_lib_preallocate_pages_for_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, rtd->pcm->card->dev, MIN_BUFFER, MAX_BUFFER); parent, MIN_BUFFER, MAX_BUFFER); return 0; } Loading
sound/soc/codecs/hdac_hda.c +4 −0 Original line number Diff line number Diff line Loading @@ -495,6 +495,10 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev) static int hdac_hda_dev_remove(struct hdac_device *hdev) { struct hdac_hda_priv *hda_pvt; hda_pvt = dev_get_drvdata(&hdev->dev); cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work); return 0; } Loading
sound/soc/codecs/hdac_hdmi.c +48 −9 Original line number Diff line number Diff line Loading @@ -88,8 +88,10 @@ struct hdac_hdmi_port { hda_nid_t mux_nids[HDA_MAX_CONNECTIONS]; struct hdac_hdmi_eld eld; const char *jack_pin; bool is_connect; struct snd_soc_dapm_context *dapm; const char *output_pin; struct work_struct dapm_work; }; struct hdac_hdmi_pcm { Loading Loading @@ -163,11 +165,7 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm, { struct hdac_device *hdev = port->pin->hdev; if (is_connect) snd_soc_dapm_enable_pin(port->dapm, port->jack_pin); else snd_soc_dapm_disable_pin(port->dapm, port->jack_pin); port->is_connect = is_connect; if (is_connect) { /* * Report Jack connect event when a device is connected Loading @@ -193,10 +191,32 @@ static void hdac_hdmi_jack_report(struct hdac_hdmi_pcm *pcm, if (pcm->jack_event > 0) pcm->jack_event--; } } static void hdac_hdmi_port_dapm_update(struct hdac_hdmi_port *port) { if (port->is_connect) snd_soc_dapm_enable_pin(port->dapm, port->jack_pin); else snd_soc_dapm_disable_pin(port->dapm, port->jack_pin); snd_soc_dapm_sync(port->dapm); } static void hdac_hdmi_jack_dapm_work(struct work_struct *work) { struct hdac_hdmi_port *port; port = container_of(work, struct hdac_hdmi_port, dapm_work); hdac_hdmi_port_dapm_update(port); } static void hdac_hdmi_jack_report_sync(struct hdac_hdmi_pcm *pcm, struct hdac_hdmi_port *port, bool is_connect) { hdac_hdmi_jack_report(pcm, port, is_connect); hdac_hdmi_port_dapm_update(port); } /* MST supported verbs */ /* * Get the no devices that can be connected to a port on the Pin widget. Loading Loading @@ -904,7 +924,7 @@ static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol *kcontrol, list_for_each_entry_safe(p, p_next, &pcm->port_list, head) { if (p == port && p->id == port->id && p->pin == port->pin) { hdac_hdmi_jack_report(pcm, port, false); hdac_hdmi_jack_report_sync(pcm, port, false); list_del(&p->head); } } Loading @@ -918,7 +938,7 @@ static int hdac_hdmi_set_pin_port_mux(struct snd_kcontrol *kcontrol, if (!strcmp(cvt_name, pcm->cvt->name)) { list_add_tail(&port->head, &pcm->port_list); if (port->eld.monitor_present && port->eld.eld_valid) { hdac_hdmi_jack_report(pcm, port, true); hdac_hdmi_jack_report_sync(pcm, port, true); mutex_unlock(&hdmi->pin_mutex); return ret; } Loading Loading @@ -1281,16 +1301,20 @@ static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin, * report jack here. It will be done in usermode mux * control select. */ if (pcm) if (pcm) { hdac_hdmi_jack_report(pcm, port, false); schedule_work(&port->dapm_work); } mutex_unlock(&hdmi->pin_mutex); return; } if (port->eld.monitor_present && port->eld.eld_valid) { if (pcm) if (pcm) { hdac_hdmi_jack_report(pcm, port, true); schedule_work(&port->dapm_work); } print_hex_dump_debug("ELD: ", DUMP_PREFIX_OFFSET, 16, 1, port->eld.eld_buffer, port->eld.eld_size, false); Loading Loading @@ -1319,6 +1343,7 @@ static int hdac_hdmi_add_ports(struct hdac_device *hdev, for (i = 0; i < max_ports; i++) { ports[i].id = i; ports[i].pin = pin; INIT_WORK(&ports[i].dapm_work, hdac_hdmi_jack_dapm_work); } pin->ports = ports; pin->num_ports = max_ports; Loading Loading @@ -2083,8 +2108,20 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev) return ret; } static void clear_dapm_works(struct hdac_device *hdev) { struct hdac_hdmi_priv *hdmi = hdev_to_hdmi_priv(hdev); struct hdac_hdmi_pin *pin; int i; list_for_each_entry(pin, &hdmi->pin_list, head) for (i = 0; i < pin->num_ports; i++) cancel_work_sync(&pin->ports[i].dapm_work); } static int hdac_hdmi_dev_remove(struct hdac_device *hdev) { clear_dapm_works(hdev); snd_hdac_display_power(hdev->bus, hdev->addr, false); return 0; Loading @@ -2103,6 +2140,8 @@ static int hdac_hdmi_runtime_suspend(struct device *dev) if (!bus) return 0; clear_dapm_works(hdev); /* * Power down afg. * codec_read is preferred over codec_write to set the power state. Loading
sound/soc/codecs/max98373.c +6 −0 Original line number Diff line number Diff line Loading @@ -268,6 +268,12 @@ static int max98373_dai_hw_params(struct snd_pcm_substream *substream, case 48000: sampling_rate = MAX98373_PCM_SR_SET1_SR_48000; break; case 88200: sampling_rate = MAX98373_PCM_SR_SET1_SR_88200; break; case 96000: sampling_rate = MAX98373_PCM_SR_SET1_SR_96000; break; default: dev_err(component->dev, "rate %d not supported\n", params_rate(params)); Loading