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

Commit fb36dc14 authored by Laxminath Kasam's avatar Laxminath Kasam Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: msm: add support for WCD interrupt config via LPI TLMM



Configure LPI interrupt registers inorder to setup
WCD interrupt triggered via LPI TLMM as direct apps interrupt.

Change-Id: Ifd41990058f8bbce8ba488770ffbfcd9b6067ad6
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent a5316f0d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2797,6 +2797,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
		pdata->hph_en0_gpio = 0;
	}
	devm_kfree(&pdev->dev, pdata);
	if (pdata->snd_card_val != INT_SND_CARD)
		msm_ext_cdc_deinit();
	return ret;
}

@@ -2807,6 +2809,8 @@ 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_free_auxdev_mem(pdev);

	gpio_free(pdata->us_euro_gpio);
+76 −0
Original line number Diff line number Diff line
@@ -35,6 +35,22 @@
#define CODEC_EXT_CLK_RATE          9600000
#define ADSP_STATE_READY_TIMEOUT_MS 3000

#define TLMM_CENTER_MPM_WAKEUP_INT_EN_0 0x03596000
#define LPI_GPIO_22_WAKEUP_VAL 0x00000002

#define TLMM_LPI_DIR_CONN_INTR1_CFG_APPS 0x0359D004
#define LPI_GPIO_22_INTR1_CFG_VAL 0x01
#define LPI_GPIO_22_INTR1_CFG_MASK 0x03

#define TLMM_LPI_GPIO_INTR_CFG1  0x0359B004
#define LPI_GPIO_INTR_CFG1_VAL 0x00000113

#define TLMM_LPI_GPIO22_CFG  0x15078040
#define LPI_GPIO22_CFG_VAL 0x0000009

#define TLMM_LPI_GPIO22_INOUT  0x15078044
#define LPI_GPIO22_INOUT_VAL 0x00000000

#define WSA8810_NAME_1 "wsa881x.20170211"
#define WSA8810_NAME_2 "wsa881x.20170212"

@@ -50,6 +66,16 @@ 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);
@@ -1193,6 +1219,27 @@ static void msm_afe_clear_config(void)
	afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
}

static void msm_snd_interrupt_config(void)
{
	int val;

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

	val = ioread32(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(LPI_GPIO_INTR_CFG1_VAL,
			msm_snd_intr_lpi.lpi_gpio_intr_cfg);
	iowrite32(LPI_GPIO22_CFG_VAL,
			msm_snd_intr_lpi.lpi_gpio_cfg);
	iowrite32(LPI_GPIO22_INOUT_VAL,
			msm_snd_intr_lpi.lpi_gpio_inout);
}

static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
{
	int ret = 0;
@@ -1221,6 +1268,7 @@ static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
		ret = -ETIMEDOUT;
		goto err_fail;
	}
	msm_snd_interrupt_config();

	ret = msm_afe_set_config(codec);
	if (ret)
@@ -1759,7 +1807,35 @@ int msm_ext_cdc_init(struct platform_device *pdev,
			ret);
		ret = 0;
	}
	msm_snd_intr_lpi.mpm_wakeup =
			ioremap(TLMM_CENTER_MPM_WAKEUP_INT_EN_0, 4);
	msm_snd_intr_lpi.intr1_cfg_apps =
			ioremap(TLMM_LPI_DIR_CONN_INTR1_CFG_APPS, 4);
	msm_snd_intr_lpi.lpi_gpio_intr_cfg =
			ioremap(TLMM_LPI_GPIO_INTR_CFG1, 4);
	msm_snd_intr_lpi.lpi_gpio_cfg =
			ioremap(TLMM_LPI_GPIO22_CFG, 4);
	msm_snd_intr_lpi.lpi_gpio_inout =
			ioremap(TLMM_LPI_GPIO22_INOUT, 4);
err:
	return ret;
}
EXPORT_SYMBOL(msm_ext_cdc_init);

/**
 * msm_ext_cdc_deinit - external codec machine specific deinit.
 */
void msm_ext_cdc_deinit(void)
{
	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);
}
EXPORT_SYMBOL(msm_ext_cdc_deinit);
+5 −1
Original line number Diff line number Diff line
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -34,6 +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(void);
void msm_ext_cdc_deinit(void);
#else
inline int msm_ext_cdc_init(struct platform_device *pdev,
			    struct msm_asoc_mach_data *pdata,
@@ -46,5 +47,8 @@ inline int msm_ext_cdc_init(struct platform_device *pdev,
inline void msm_ext_register_audio_notifier(void)
{
}
inline void msm_ext_cdc_deinit(void)
{
}
#endif
#endif