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

Commit 5ad1b37c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: lahaina: Update wsa883x aux codec configuration on lahaina"

parents 0add91a7 5a0d1cee
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1387,15 +1387,23 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP,
			"WSA OCP", wsa883x_ocp_handle_irq, NULL);

	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP);

	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLIP,
			"WSA CLIP", wsa883x_clip_handle_irq, NULL);

	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLIP);

	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PDM_WD,
			"WSA PDM WD", wsa883x_pdm_wd_handle_irq, NULL);

	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PDM_WD);

	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD,
			"WSA CLK WD", wsa883x_clk_wd_handle_irq, NULL);

	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD);

	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_INTR_PIN,
			"WSA EXT INT", wsa883x_ext_int_handle_irq, NULL);

@@ -1406,6 +1414,8 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
	wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR,
			"WSA PA ERR", wsa883x_pa_on_err_handle_irq, NULL);

	wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR);

	ret = snd_soc_register_component(&pdev->dev, &soc_codec_dev_wsa883x,
				     NULL, 0);
	if (ret) {
+33 −43
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#include "asoc/msm-cdc-pinctrl.h"
#include "asoc/wcd-mbhc-v2.h"
#include "codecs/wcd938x/wcd938x-mbhc.h"
#include "codecs/wsa881x.h"
#include "codecs/wsa883x/wsa883x.h"
#include "codecs/wcd938x/wcd938x.h"
#include "codecs/bolero/bolero-cdc.h"
#include <dt-bindings/sound/audio-codec-port-types.h>
@@ -78,8 +78,6 @@

#define ADSP_STATE_READY_TIMEOUT_MS 3000

#define WSA8810_NAME_1 "wsa881x.20170211"
#define WSA8810_NAME_2 "wsa881x.20170212"
#define WCN_CDC_SLIM_RX_CH_MAX 2
#define WCN_CDC_SLIM_TX_CH_MAX 2
#define WCN_CDC_SLIM_TX_CH_MAX_LITO 3
@@ -173,6 +171,12 @@ enum {
	AFE_LOOPBACK_TX_IDX = 0,
	AFE_LOOPBACK_TX_IDX_MAX,
};

static const char* wsa883x_devices[] = {
	"wsa883x.202170221",
	"wsa883x.202170222",
};

struct msm_asoc_mach_data {
	struct snd_info_entry *codec_root;
	int usbc_en2_gpio; /* used by gpio driver API */
@@ -207,7 +211,7 @@ enum {
	EXT_DISP_RX_IDX_MAX,
};

struct msm_wsa881x_dev_info {
struct msm_wsa883x_dev_info {
	struct device_node *of_node;
	u32 index;
};
@@ -5328,7 +5332,6 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
	struct snd_soc_dapm_context *dapm;
	struct snd_card *card;
	struct snd_info_entry *entry;
	struct snd_soc_component *aux_comp;
	struct msm_asoc_mach_data *pdata =
				snd_soc_card_get_drvdata(rtd->card);

@@ -5389,18 +5392,6 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
		__func__, rtd->card->num_aux_devs);
	if (rtd->card->num_aux_devs &&
	    !list_empty(&rtd->card->component_dev_list)) {
		list_for_each_entry(aux_comp,
				&rtd->card->aux_comp_list,
				card_aux_list) {
			if (aux_comp->name != NULL && (
				!strcmp(aux_comp->name, WSA8810_NAME_1) ||
		    		!strcmp(aux_comp->name, WSA8810_NAME_2))) {
				wsa_macro_set_spkr_mode(component,
						WSA_MACRO_SPKR_MODE_1);
				wsa_macro_set_spkr_gain_offset(component,
						WSA_MACRO_GAIN_OFFSET_M1P5_DB);
			}
		}
		if (pdata->lito_v2_enabled) {
			/*
			 * Enable tx data line3 for saipan version v2 amd
@@ -7151,16 +7142,16 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
}

#if IS_ENABLED(CONFIG_AUDIO_QGKI)
static int msm_wsa881x_init(struct snd_soc_component *component)
static int msm_wsa883x_init(struct snd_soc_component *component)
{
	u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
	u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
	u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
	u8 spkleft_ports[WSA883X_MAX_SWR_PORTS] = {0, 1, 2, 3};
	u8 spkright_ports[WSA883X_MAX_SWR_PORTS] = {0, 1, 2, 3};
	u8 spkleft_port_types[WSA883X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
						SPKR_L_BOOST, SPKR_L_VI};
	u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
	u8 spkright_port_types[WSA883X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
						SPKR_R_BOOST, SPKR_R_VI};
	unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
	unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
	unsigned int ch_rate[WSA883X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
	unsigned int ch_mask[WSA883X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
	struct msm_asoc_mach_data *pdata;
	struct snd_soc_dapm_context *dapm;
	struct snd_card *card;
@@ -7178,8 +7169,8 @@ static int msm_wsa881x_init(struct snd_soc_component *component)
	if (!strcmp(component->name_prefix, "SpkrLeft")) {
		dev_dbg(component->dev, "%s: setting left ch map to codec %s\n",
			__func__, component->name);
		wsa881x_set_channel_map(component, &spkleft_ports[0],
				WSA881X_MAX_SWR_PORTS, &ch_mask[0],
		wsa883x_set_channel_map(component, &spkleft_ports[0],
				WSA883X_MAX_SWR_PORTS, &ch_mask[0],
				&ch_rate[0], &spkleft_port_types[0]);
		if (dapm->component) {
			snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
@@ -7188,8 +7179,8 @@ static int msm_wsa881x_init(struct snd_soc_component *component)
	} else if (!strcmp(component->name_prefix, "SpkrRight")) {
		dev_dbg(component->dev, "%s: setting right ch map to codec %s\n",
			__func__, component->name);
		wsa881x_set_channel_map(component, &spkright_ports[0],
				WSA881X_MAX_SWR_PORTS, &ch_mask[0],
		wsa883x_set_channel_map(component, &spkright_ports[0],
				WSA883X_MAX_SWR_PORTS, &ch_mask[0],
				&ch_rate[0], &spkright_port_types[0]);
		if (dapm->component) {
			snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
@@ -7213,7 +7204,7 @@ static int msm_wsa881x_init(struct snd_soc_component *component)
		}
		pdata->codec_root = entry;
	}
	wsa881x_codec_info_create_codec_entry(pdata->codec_root,
	wsa883x_codec_info_create_codec_entry(pdata->codec_root,
					      component);
err:
	return ret;
@@ -7298,8 +7289,8 @@ static int msm_init_aux_dev(struct platform_device *pdev,
	u32 codec_max_aux_devs = 0;
	u32 codec_aux_dev_cnt = 0;
	int i;
	struct msm_wsa881x_dev_info *wsa881x_dev_info;
	struct aux_codec_dev_info *aux_cdc_dev_info;
	struct msm_wsa883x_dev_info *wsa883x_dev_info;
	struct aux_codec_dev_info *aux_cdc_dev_info = NULL;
	struct snd_soc_dai_link_component *dlc;
	const char *auxdev_name_prefix[1];
	char *dev_name_str = NULL;
@@ -7369,10 +7360,10 @@ static int msm_init_aux_dev(struct platform_device *pdev,
	 * Alloc mem to store phandle and index info of WSA device, if already
	 * registered with ALSA core
	 */
	wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
					sizeof(struct msm_wsa881x_dev_info),
	wsa883x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
					sizeof(struct msm_wsa883x_dev_info),
					GFP_KERNEL);
	if (!wsa881x_dev_info) {
	if (!wsa883x_dev_info) {
		ret = -ENOMEM;
		goto err;
	}
@@ -7398,8 +7389,8 @@ static int msm_init_aux_dev(struct platform_device *pdev,
		dlc->name = NULL;
		if (soc_find_component(dlc)) {
			/* WSA device registered with ALSA core */
			wsa881x_dev_info[found].of_node = wsa_of_node;
			wsa881x_dev_info[found].index = i;
			wsa883x_dev_info[found].of_node = wsa_of_node;
			wsa883x_dev_info[found].index = i;
			found++;
			if (found == wsa_max_devs)
				break;
@@ -7413,7 +7404,7 @@ static int msm_init_aux_dev(struct platform_device *pdev,
		return -EPROBE_DEFER;
	}
	dev_info(&pdev->dev,
		"%s: found %d wsa881x devices registered with ALSA core\n",
		"%s: found %d wsa883x devices registered with ALSA core\n",
		__func__, found);

codec_aux_dev:
@@ -7546,7 +7537,7 @@ static int msm_init_aux_dev(struct platform_device *pdev,

		ret = of_property_read_string_index(pdev->dev.of_node,
						    "qcom,wsa-aux-dev-prefix",
						    wsa881x_dev_info[i].index,
						    wsa883x_dev_info[i].index,
						    auxdev_name_prefix);
		if (ret) {
			dev_err(&pdev->dev,
@@ -7556,16 +7547,15 @@ static int msm_init_aux_dev(struct platform_device *pdev,
			goto err;
		}

		snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
		msm_aux_dev[i].dlc.name = dev_name_str;
		msm_aux_dev[i].dlc.name = wsa883x_devices[i];
		msm_aux_dev[i].dlc.dai_name = NULL;
		msm_aux_dev[i].dlc.of_node =
					wsa881x_dev_info[i].of_node;
		msm_aux_dev[i].init = msm_wsa881x_init;
					wsa883x_dev_info[i].of_node;
		msm_aux_dev[i].init = msm_wsa883x_init;
		msm_codec_conf[i].dev_name = NULL;
		msm_codec_conf[i].name_prefix = auxdev_name_prefix[0];
		msm_codec_conf[i].of_node =
				wsa881x_dev_info[i].of_node;
				wsa883x_dev_info[i].of_node;
	}

	for (i = 0; i < codec_aux_dev_cnt; i++) {
+17 −11
Original line number Diff line number Diff line
@@ -1031,7 +1031,7 @@ static void swrm_disable_ports(struct swr_master *master,
					bank));
			dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x\n",
				__func__, i,
				(SWRM_DP_PORT_CTRL_BANK(i + 1, bank)));
				(SWRM_DP_PORT_CTRL_BANK((i + 1), bank)));
		}
		value = ((mport->req_ch)
					<< SWRM_DP_PORT_CTRL_EN_CHAN_SHFT);
@@ -1042,11 +1042,11 @@ static void swrm_disable_ports(struct swr_master *master,
		value |= mport->sinterval;

		swr_master_write(swrm,
				SWRM_DP_PORT_CTRL_BANK(i+1, bank),
				SWRM_DP_PORT_CTRL_BANK((i + 1), bank),
				value);
		dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n",
			__func__, i,
			(SWRM_DP_PORT_CTRL_BANK(i+1, bank)), value);
			(SWRM_DP_PORT_CTRL_BANK((i + 1), bank)), value);

		if (mport->stream_type == SWR_PCM)
			swrm_pcm_port_config(swrm, i, mport->dir, false);
@@ -1203,37 +1203,37 @@ static void swrm_copy_data_port_config(struct swr_master *master, u8 bank)
		value |= mport->sinterval;


		reg[len] = SWRM_DP_PORT_CTRL_BANK(i + 1, bank);
		reg[len] = SWRM_DP_PORT_CTRL_BANK((i + 1), bank);
		val[len++] = value;
		dev_dbg(swrm->dev, "%s: mport :%d, reg: 0x%x, val: 0x%x\n",
			__func__, i,
			(SWRM_DP_PORT_CTRL_BANK(i + 1, bank)), value);
			(SWRM_DP_PORT_CTRL_BANK((i + 1), bank)), value);

		if (mport->lane_ctrl != SWR_INVALID_PARAM) {
			reg[len] = SWRM_DP_PORT_CTRL_2_BANK(i + 1, bank);
			reg[len] = SWRM_DP_PORT_CTRL_2_BANK((i + 1), bank);
			val[len++] = mport->lane_ctrl;
		}
		if (mport->word_length != SWR_INVALID_PARAM) {
			reg[len] = SWRM_DP_BLOCK_CTRL_1(i + 1);
			reg[len] = SWRM_DP_BLOCK_CTRL_1((i + 1));
			val[len++] = mport->word_length;
		}

		if (mport->blk_grp_count != SWR_INVALID_PARAM) {
			reg[len] = SWRM_DP_BLOCK_CTRL2_BANK(i + 1, bank);
			reg[len] = SWRM_DP_BLOCK_CTRL2_BANK((i + 1), bank);
			val[len++] = mport->blk_grp_count;
		}
		if (mport->hstart != SWR_INVALID_PARAM
				&& mport->hstop != SWR_INVALID_PARAM) {
			reg[len] = SWRM_DP_PORT_HCTRL_BANK(i + 1, bank);
			reg[len] = SWRM_DP_PORT_HCTRL_BANK((i + 1), bank);
			hparams = (mport->hstop << 4) | mport->hstart;
			val[len++] = hparams;
		} else {
			reg[len] = SWRM_DP_PORT_HCTRL_BANK(i + 1, bank);
			reg[len] = SWRM_DP_PORT_HCTRL_BANK((i + 1), bank);
			hparams = (SWR_HSTOP_MAX_VAL << 4) | SWR_HSTART_MIN_VAL;
			val[len++] = hparams;
		}
		if (mport->blk_pack_mode != SWR_INVALID_PARAM) {
			reg[len] = SWRM_DP_BLOCK_CTRL3_BANK(i + 1, bank);
			reg[len] = SWRM_DP_BLOCK_CTRL3_BANK((i + 1), bank);
			val[len++] = mport->blk_pack_mode;
		}
		mport->ch_en = mport->req_ch;
@@ -2585,6 +2585,7 @@ static int swrm_runtime_resume(struct device *dev)
	bool aud_core_err = false;
	struct swr_master *mstr = &swrm->master;
	struct swr_device *swr_dev;
	u32 temp = 0;

	dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
		__func__, swrm->state);
@@ -2664,6 +2665,11 @@ static int swrm_runtime_resume(struct device *dev)
				mutex_lock(&swrm->reslock);
			}
		} else {
			if (swrm->swrm_hctl_reg) {
				temp = ioread32(swrm->swrm_hctl_reg);
				temp &= 0xFFFFFFFD;
				iowrite32(temp, swrm->swrm_hctl_reg);
			}
			/*wake up from clock stop*/
			swr_master_write(swrm, SWRM_MCP_BUS_CTRL, 0x2);
			/* clear and enable bus clash interrupt */