Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c3ed0da authored by Laxminath Kasam's avatar Laxminath Kasam
Browse files

ASoC: msm: Include interrupt registers in pdata



To fix access of unmapped memory region, add
lpi registers in pdata of node. This enables
unmapping when pdata is destroyed.

Change-Id: I62b2e50f8db39bdc430299a817ba621288ab4f3e
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 9335a12b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2909,7 +2909,7 @@ err:
	}
	devm_kfree(&pdev->dev, pdata);
	if (pdata->snd_card_val != INT_SND_CARD)
		msm_ext_cdc_deinit();
		msm_ext_cdc_deinit(pdata);
	return ret;
}

@@ -2921,7 +2921,7 @@ static int msm_asoc_machine_remove(struct platform_device *pdev)
	if (pdata->snd_card_val == INT_SND_CARD)
		mutex_destroy(&pdata->cdc_int_mclk0_mutex);
	else
		msm_ext_cdc_deinit();
		msm_ext_cdc_deinit(pdata);
	msm_free_auxdev_mem(pdev);

	gpio_free(pdata->us_euro_gpio);
+9 −0
Original line number Diff line number Diff line
@@ -78,6 +78,14 @@ enum {
	EXT_SND_CARD_TAVIL,
};

struct msm_snd_interrupt {
	void __iomem *mpm_wakeup;
	void __iomem *intr1_cfg_apps;
	void __iomem *lpi_gpio_intr_cfg;
	void __iomem *lpi_gpio_cfg;
	void __iomem *lpi_gpio_inout;
};

struct msm_asoc_mach_data {
	int us_euro_gpio; /* used by gpio driver API */
	int hph_en1_gpio;
@@ -105,6 +113,7 @@ struct msm_asoc_mach_data {
	struct mutex cdc_int_mclk0_mutex;
	struct delayed_work disable_int_mclk0_work;
	struct afe_clk_set digital_cdc_core_clk;
	struct msm_snd_interrupt msm_snd_intr_lpi;
};

int msm_common_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+29 −35
Original line number Diff line number Diff line
@@ -67,16 +67,6 @@ struct msm_asoc_wcd93xx_codec {
static struct msm_asoc_wcd93xx_codec msm_codec_fn;
static struct platform_device *spdev;

struct msm_snd_interrupt {
	void __iomem *mpm_wakeup;
	void __iomem *intr1_cfg_apps;
	void __iomem *lpi_gpio_intr_cfg;
	void __iomem *lpi_gpio_cfg;
	void __iomem *lpi_gpio_inout;
};

static struct msm_snd_interrupt msm_snd_intr_lpi;

static bool is_initial_boot;

static void *def_ext_mbhc_cal(void);
@@ -1220,25 +1210,25 @@ static void msm_afe_clear_config(void)
	afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
}

static void msm_snd_interrupt_config(void)
static void msm_snd_interrupt_config(struct msm_asoc_mach_data *pdata)
{
	int val;

	val = ioread32(msm_snd_intr_lpi.mpm_wakeup);
	val = ioread32(pdata->msm_snd_intr_lpi.mpm_wakeup);
	val |= LPI_GPIO_22_WAKEUP_VAL;
	iowrite32(val, msm_snd_intr_lpi.mpm_wakeup);
	iowrite32(val, pdata->msm_snd_intr_lpi.mpm_wakeup);

	val = ioread32(msm_snd_intr_lpi.intr1_cfg_apps);
	val = ioread32(pdata->msm_snd_intr_lpi.intr1_cfg_apps);
	val &= ~(LPI_GPIO_22_INTR1_CFG_MASK);
	val |= LPI_GPIO_22_INTR1_CFG_VAL;
	iowrite32(val, msm_snd_intr_lpi.intr1_cfg_apps);
	iowrite32(val, pdata->msm_snd_intr_lpi.intr1_cfg_apps);

	iowrite32(LPI_GPIO_INTR_CFG1_VAL,
			msm_snd_intr_lpi.lpi_gpio_intr_cfg);
			pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg);
	iowrite32(LPI_GPIO22_CFG_VAL,
			msm_snd_intr_lpi.lpi_gpio_cfg);
			pdata->msm_snd_intr_lpi.lpi_gpio_cfg);
	iowrite32(LPI_GPIO22_INOUT_VAL,
			msm_snd_intr_lpi.lpi_gpio_inout);
			pdata->msm_snd_intr_lpi.lpi_gpio_inout);
}

static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
@@ -1246,7 +1236,10 @@ static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
	int ret = 0;
	unsigned long timeout;
	int adsp_ready = 0;
	struct snd_soc_card *card = codec->component.card;
	struct msm_asoc_mach_data *pdata;

	pdata = snd_soc_card_get_drvdata(card);
	timeout = jiffies +
		msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS);

@@ -1269,7 +1262,7 @@ static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
		ret = -ETIMEDOUT;
		goto err_fail;
	}
	msm_snd_interrupt_config();
	msm_snd_interrupt_config(pdata);

	ret = msm_afe_set_config(codec);
	if (ret)
@@ -1817,15 +1810,15 @@ int msm_ext_cdc_init(struct platform_device *pdev,
			ret);
		ret = 0;
	}
	msm_snd_intr_lpi.mpm_wakeup =
	pdata->msm_snd_intr_lpi.mpm_wakeup =
			ioremap(TLMM_CENTER_MPM_WAKEUP_INT_EN_0, 4);
	msm_snd_intr_lpi.intr1_cfg_apps =
	pdata->msm_snd_intr_lpi.intr1_cfg_apps =
			ioremap(TLMM_LPI_DIR_CONN_INTR1_CFG_APPS, 4);
	msm_snd_intr_lpi.lpi_gpio_intr_cfg =
	pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg =
			ioremap(TLMM_LPI_GPIO_INTR_CFG1, 4);
	msm_snd_intr_lpi.lpi_gpio_cfg =
	pdata->msm_snd_intr_lpi.lpi_gpio_cfg =
			ioremap(TLMM_LPI_GPIO22_CFG, 4);
	msm_snd_intr_lpi.lpi_gpio_inout =
	pdata->msm_snd_intr_lpi.lpi_gpio_inout =
			ioremap(TLMM_LPI_GPIO22_INOUT, 4);
err:
	return ret;
@@ -1835,17 +1828,18 @@ EXPORT_SYMBOL(msm_ext_cdc_init);
/**
 * msm_ext_cdc_deinit - external codec machine specific deinit.
 */
void msm_ext_cdc_deinit(void)
void msm_ext_cdc_deinit(struct msm_asoc_mach_data *pdata)
{
	if (msm_snd_intr_lpi.mpm_wakeup)
		iounmap(msm_snd_intr_lpi.mpm_wakeup);
	if (msm_snd_intr_lpi.intr1_cfg_apps)
		iounmap(msm_snd_intr_lpi.intr1_cfg_apps);
	if (msm_snd_intr_lpi.lpi_gpio_intr_cfg)
		iounmap(msm_snd_intr_lpi.lpi_gpio_intr_cfg);
	if (msm_snd_intr_lpi.lpi_gpio_cfg)
		iounmap(msm_snd_intr_lpi.lpi_gpio_cfg);
	if (msm_snd_intr_lpi.lpi_gpio_inout)
		iounmap(msm_snd_intr_lpi.lpi_gpio_inout);
	if (pdata->msm_snd_intr_lpi.mpm_wakeup)
		iounmap(pdata->msm_snd_intr_lpi.mpm_wakeup);
	if (pdata->msm_snd_intr_lpi.intr1_cfg_apps)
		iounmap(pdata->msm_snd_intr_lpi.intr1_cfg_apps);
	if (pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg)
		iounmap(pdata->msm_snd_intr_lpi.lpi_gpio_intr_cfg);
	if (pdata->msm_snd_intr_lpi.lpi_gpio_cfg)
		iounmap(pdata->msm_snd_intr_lpi.lpi_gpio_cfg);
	if (pdata->msm_snd_intr_lpi.lpi_gpio_inout)
		iounmap(pdata->msm_snd_intr_lpi.lpi_gpio_inout);

}
EXPORT_SYMBOL(msm_ext_cdc_deinit);
+1 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ int msm_ext_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
int msm_ext_cdc_init(struct platform_device *, struct msm_asoc_mach_data *,
		     struct snd_soc_card **, struct wcd_mbhc_config *);
void msm_ext_register_audio_notifier(struct platform_device *pdev);
void msm_ext_cdc_deinit(void);
void msm_ext_cdc_deinit(struct msm_asoc_mach_data *pdata);
#else
inline int msm_ext_cdc_init(struct platform_device *pdev,
			    struct msm_asoc_mach_data *pdata,