Unverified Commit dd28d54c authored by Mark Brown's avatar Mark Brown
Browse files

Merge branch 'asoc-5.3' into asoc-5.4

parents d5e12042 bf283a05
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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>
+9 −11
Original line number Diff line number Diff line
@@ -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;
};

@@ -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)
@@ -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);

@@ -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) {
@@ -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;

@@ -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;
@@ -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;
}

+4 −0
Original line number Diff line number Diff line
@@ -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;
}

+48 −9
Original line number Diff line number Diff line
@@ -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 {
@@ -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
@@ -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.
@@ -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);
			}
		}
@@ -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;
			}
@@ -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);
@@ -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;
@@ -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;
@@ -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.
+6 −0
Original line number Diff line number Diff line
@@ -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